出于某些原因,我不得不在Python中使用regex的非贪婪模式。 下面是代码(您可能觉得有点奇怪):
import re
# the string
s = u"<n-0><LBRACKET-1><eng-2><RBRACKET-3><n-4><n-5><v-6><n-7><m-8><GRAM-9><PU-10><n-11><LBRACKET-12><n-13><n-14><RBRACKET-15><m-16><GRAM-17>"
# the pattern
p = ur"(?P<name>(?:<n-\d+>)+(<LBRACKET-\d+>.*?<RBRACKET-\d+>)?)(?P<amount><m-\d+>)(?P<measure><GRAM-\d+>)"
tmp = re.search(p, s).group()
结果{cd2>结果是
我认为这与regex的非贪婪模式有关。有人能指出我错在哪里吗?在
我想这就是你想要的:
说明:原始模式的问题是
LBRACKET
和RBRACKET
之间的一个包罗万象的片段.*?
。是的,它不是贪婪的,但贪婪只适用于当引擎有两个或更多匹配的选择。在您的模式中,没有选择,因为只有一个RBRACKET
后跟<m...>
。因此,它与<n-0><LBRACKET-1>...<RBRACKET-15>
匹配,不再进一步查找,因为它是一个有效的(也是最短的)匹配。通过添加一个否定的lookback,我们显式地告诉引擎.*?
不应该包含RBRACKET
,从而迫使它尝试更多的组合。在相关问题 更多 >
编程相关推荐