【问题标题】:Does Python regular expression library re have a maximum match [duplicate]Python正则表达式库是否有最大匹配[重复]
【发布时间】:2020-06-28 21:17:49
【问题描述】:

我在网上搜索过(也许我在搜索错误的东西),但我有一个很长的正则表达式模式,我想匹配:

例如:

import re

re_pattern_str = r"I want to match this \(this is an example\) regular expression to a giant string"

sample_paragraph = "I want to match this (this is an example) regular expression to a giant string. This is a huge paragraph with a bunch of stuff in it"

print(re.match(re_pattern_str, sample_paragraph))

上述程序的输出如下:

运行

<re.Match object; span=(0, 78), match='I want to match this (this is an example) regular>

如您所见,它被截断了,并没有捕获整个字符串。

另外,我注意到使用带有大量 cmets 的详细模式(Python 中的(?x))捕获的内容更少。这是否意味着可以捕获的数量有限制?我还注意到使用不同的 Python 版本和不同的机器会导致捕获不同数量的长正则表达式字符串。我仍然无法确定这是否是 Python 中的 re 库中的问题、特定于 Python 3 的问题(我没有将其与 Python 2 进行比较)、机器问题、内存问题或其他问题。

我在上面的示例中使用了 Python 3.8.1,并在另一个示例中使用了 Python 3.7.2,使用了详细的正则表达式和其他示例(我无法分享这些示例,因为它们是专有的)。

任何有关 Python 正则表达式引擎机制以及为什么会发生这种情况的帮助(如果有可以通过正则表达式捕获的最大长度,为什么?),这将非常有帮助。

【问题讨论】:

  • 为什么你认为它会匹配更多的字符串?您的模式与整个字符串不匹配。我怀疑您的冗长行为是因为您意外更改了其他内容。关键是,您可以在这里向我们展示的任何字符串都没有长度限制(也许在多 GB 范围内匹配可能存在问题,但我没有证据表明这个)。
  • 您的正则表达式不包含可选元素,因此无法匹配小于完整模式的任何内容。匹配对象的__repr__() 显然正在修剪显示,大概是为了避免在真正长匹配的情况下压倒你的终端。
  • m.group(0) 'I want to match this (this is an example) regular expression to a giant string' 确实 匹配整个表达式。匹配对象的repr() 不是您应该使用的。如果要捕获以表达式开头的任何字符串的全部,则在表达式末尾添加.*

标签: python regex python-3.x


【解决方案1】:

你认为匹配的repr匹配的文本。它不是。 repr 尽量不为大型匹配转储文本页面。如果您想查看完整匹配的文本,请索引以将其作为字符串获取:

print(re.match(re_pattern_str, sample_paragraph)[0])
                                               #^^^ gets the matched text itself

您可以从 repr 看到它的匹配时间要长得多(它跨越索引 0 到 78)。

【讨论】:

  • 请考虑关闭明显重复的问题,而不是一次又一次地重新回答类似的问题。这个问题被问得太频繁了,答案很简短,而且总是一样的。它是Python extract pattern matches 的副本。还有How do I return a string from a regex match in python? 等等。
  • @WiktorStribiżew:当我记得存在重复时,我会这样做。这个没有明显的重复,或者至少我不记得找到它的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
相关资源
最近更新 更多