gpt4 book ai didi

python - Python re 模块中的非贪婪模式

转载 作者:行者123 更新时间:2023-11-28 18:43:30 25 4
gpt4 key购买 nike

出于某种原因,我必须在 Python 中使用正则表达式的非贪婪模式。这是代码(您可能看起来有点奇怪):

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()

结果是整个字符串s , 但我希望结果是 <n-7><m-8><GRAM-9><n-11><LBRACKET-12><n-13><n-14><RBRACKET-15><m-16><GRAM-17>

我认为这与正则表达式的非贪婪模式有关。谁能指出我错在哪里?

最佳答案

我想这就是您要找的:

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

说明:原始模式的问题是包罗万象的片段 .*?LBRACKET 之间和 RBRACKET .是的,它是非贪婪的,但贪婪仅适用于引擎可以在两个或多个匹配项之间进行选择的情况。在您的模式中,别无选择,因为只有一个 RBRACKET其次是 <m...> .因此,它匹配 <n-0><LBRACKET-1>...<RBRACKET-15>并且不会在那里再看,因为它是有效(且最短)的匹配。通过添加负向后视,我们明确地告诉引擎 .*?不应包含 RBRACKET从而迫使它尝试更多组合。

关于python - Python re 模块中的非贪婪模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23320672/

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