非贪婪的通配符似乎可以贪婪地匹配?

时间:2019-11-04 23:59:31

标签: python search greedy

我需要理解为什么当我指定不匹配正则表达式时会贪婪地匹配它。

给出string='.GATA..GATA..ETS..ETS.'

返回GATA ... ETS的最短子串

我使用正则表达式模式pattern = r'(GATA).*?(ETS)'

syntax_finder=re.compile(pattern,re.IGNORECASE)

for match in syntax_finder.finditer(string):
    print(match)

返回<re.Match object; span=(1, 17), match='GATA..GATA..ETS'>

但是,我希望它返回'GATA..ETS'

有人知道为什么会这样吗?

我没有在寻找完全匹配问题的解决方案。我将使用更复杂的GATA和ETS模式进行很多此类搜索,但我将始终希望它返回最短的匹配项。

谢谢!

1 个答案:

答案 0 :(得分:1)

  

有人知道为什么会这样吗?

正则表达式非贪婪匹配。它找到第一个GATA,然后,因为使用.*?而不是.*,所以匹配直到之后 first ETS。只是碰巧还有另外一个GATA,这是您不想要的-但是哪个非贪婪匹配并不在意。

  

我将使用更复杂的GATA和ETS模式进行很多这类搜索

然后正则表达式可能无法胜任这项工作。我的建议是使用它们将字符串分成GATA,ETS和中间部分(令牌化),然后使用其他技术来查找该序列中的模式( parsing

  

我没有在寻找完全匹配问题的解决方案。

但我无法抗拒:)

>>> re.search(r'(GATA)((?<!GAT)A|[^A])*?(ETS)', '.GATA..GATA..ETS..ETS.')
<_sre.SRE_Match object; span=(7, 16), match='GATA..ETS'>

在这里,我们使用否定的后置断言:扫描GATAETS之间的部分时,如果A之前没有GAT,则只允许它。 / p>