gpt4 book ai didi

Python 正则表达式问号运算符不起作用?

转载 作者:太空狗 更新时间:2023-10-29 20:15:57 25 4
gpt4 key购买 nike

import re
str='abc defg'
m1 = re.match(".*(def)?",str)
m2 = re.match(".*(def)",str)
print (m1.group(1),m2.group(1))

上面的输出是:

(None, 'def')

这是怎么回事?即使使用非贪婪重复运算符,可选的捕获组 (def)? 也不匹配。

最佳答案

下面是正则表达式引擎尝试将 .*(def)abc defg 进行匹配时发生的情况:

  • 首先,引擎开始尝试匹配字符串开头的正则表达式。
  • 贪心子模式 .* 最初尝试尽可能多地匹配,匹配整个字符串。
  • 由于这会导致剩余的匹配失败,正则表达式引擎会回溯直到它找到匹配 (def) 的方法,这发生在 .* 时仅匹配 abc

但是,如果我们将正则表达式更改为 .*(def)?,则会发生以下情况:

  • 首先,正则表达式引擎再次从字符串的开头开始。
  • 接下来,它再次尝试尽可能多次匹配 .*,匹配整个字符串。
  • 但此时,由于正则表达式的所有其余部分都是可选的,它已经找到了整个正则表达式的匹配项!由于 (def)? 是贪婪的,如果可以的话,引擎更愿意匹配它,但它不会回溯早期的子模式只是为了看看它是否可以。相反,它只是让 .* 吞噬整个字符串,不给 (def)? 留下任何东西。

.*?(def).*?(def)? 会发生类似的情况:

  • 同样,引擎从字符串的开头开始。
  • 不贪婪的子模式 .*? 尝试尽可能匹配几次,即根本不匹配。
  • 此时,(def) 无法匹配,但 (def)? 可以。因此,对于 (def),正则表达式引擎必须返回并考虑对 .*? 进行更长的匹配,直到它找到一个可以让完整模式匹配的匹配项,而对于 (def)? 它不必这样做,所以它也不需要。

有关详细信息,请参阅 "Combining RE Pieces" section of the Perl regular expressions manual (这与 Python 的“Perl 兼容”正则表达式的行为相匹配)。

关于Python 正则表达式问号运算符不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14115922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com