【发布时间】: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