野草外卡似乎匹配贪婪?

2024-09-28 22:04:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

给定string='.GATA..GATA..ETS..ETS.'

返回GATA…ETS的最短子串

我使用regex模式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模式进行大量此类搜索,但我始终希望它返回最短的匹配

谢谢


Tags: reforstringfindermatch模式regexpattern
1条回答
网友
1楼 · 发布于 2024-09-28 22:04:20

Does anyone know why this is happening?

正则表达式与非贪婪匹配。它找到第一个GATA,然后,因为使用的是.*?,而不是.*,匹配到之后的第一个ETS。碰巧还有另一个GATA,你不想要,但非贪婪匹配不关心

I will be doing a lot of these types of searches with more complicated patterns of GATA and ETS

那么正则表达式很可能没有足够的能力胜任这项工作。我的建议是使用它们将字符串拆分为GATA、ETS和中间部分(标记化),然后使用其他技术找到该序列中的模式(解析

I am not looking for a solution to this exact matching problem.

但我无法抗拒:)

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

这里我们使用一个否定的lookback断言:当扫描GATAETS之间的部分时,我们只允许A如果它前面没有GAT

相关问题 更多 >