Python-re-modu中的Nongreedy模式

2024-10-05 11:03:52 发布

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

出于某些原因,我不得不在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的非贪婪模式有关。有人能指出我错在哪里吗?在


Tags: the代码importrestring模式原因eng
1条回答
网友
1楼 · 发布于 2024-10-05 11:03:52

我想这就是你想要的:

p = ur"(?P<name>(?:<n-\d+>)+(<LBRACKET-\d+>((?<!RBRACKET).)*?<RBRACKET-\d+>)?)(?P<amount><m-\d+>)(?P<measure><GRAM-\d+>)"

说明:原始模式的问题是LBRACKETRBRACKET之间的一个包罗万象的片段.*?。是的,它不是贪婪的,但贪婪只适用于当引擎有两个或更多匹配的选择。在您的模式中,没有选择,因为只有一个RBRACKET后跟<m...>。因此,它与<n-0><LBRACKET-1>...<RBRACKET-15>匹配,不再进一步查找,因为它是一个有效的(也是最短的)匹配。通过添加一个否定的lookback,我们显式地告诉引擎.*?不应该包含RBRACKET,从而迫使它尝试更多的组合。在

相关问题 更多 >

    热门问题