gpt4 book ai didi

Python 正则表达式 : force greedy match using alternation

转载 作者:太空宇宙 更新时间:2023-11-03 11:28:39 25 4
gpt4 key购买 nike

我有一个正则表达式:

a(bc|de|def)g?

在字符串 adefg 上,此模式仅匹配到“ade”,并且它显然会在交替组中的第一个匹配项上退出。从“g”标记中删除 ? 选项允许模式匹配整个字符串。这是有道理的,因为“?”是非贪婪的。 [编辑:我已被纠正,“?” 贪婪的,这似乎增加了我的困惑。在我看来,如果“?”是非贪婪的,这允许模式在更大的匹配可用时提前退出。]

我想避免在交替中重新排列字符串的顺序,我可以通过将 (\b|$) 附加到模式来解决问题,但现在我真的很想知道是否还有其他解决方案

例如,有什么方法可以使“?”贪婪还是强制交替不在第一场比赛中退出?

最佳答案

你不能让 | 不从左到右匹配它的成分,因为从左到右匹配的是它的 documented行为。即使你可以让 ? 变得“贪婪”,它也行不通,因为正则表达式从头到尾匹配,所以 ? 的贪婪不可能有直到交替已经匹配之后才会产生效果。

贪婪不会让正则表达式引擎回头寻找“更好的方式”来匹配;它将尽可能匹配第一种方式。它只会使用 g? 如果它必须这样做才能使整个匹配成功,并且如果它可以忽略它并坚持匹配的内容则不必这样做在交替。换句话说,一旦它匹配“ade”,它就可以成功并停止(因为它不需要匹配“g”,因为它是可选的)。因此它甚至不考虑交替的其他部分,因为它可以找到一种方法使其使用第一个部分工作。一个贪婪的 ? 不会让它返回并重试它已经匹配的其他东西,除非它需要整个匹配才能成功。

如果您使用的交替是某些交替是其他交替的子串,则应将它们按顺序排列,以便最长的排在第一位。

另一种可能性是在正则表达式的末尾添加一个$。这将强制它一直走到字符串的末尾,因此它回溯并尝试其他替代方案,因为现在“ade”将不匹配(因为它不匹配匹配 $)。但是,这仅在您确实想要匹配整个字符串时才有效。

关于Python 正则表达式 : force greedy match using alternation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28145273/

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