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

上面的输出是:

(无,'def')

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

4

1 回答 1

15

以下是当正则表达式引擎尝试匹配时发生的.*(def)情况abc defg

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

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

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

类似的事情发生在.*?(def)and上.*?(def)?

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

有关更多信息,请参阅Perl 正则表达式手册的“组合 RE 片段”部分(它与 Python 的“Perl 兼容”正则表达式的行为相匹配)。

于 2013-01-02T02:16:50.800 回答