【问题标题】:Behaviour of Python non-greedy regular expressionPython 非贪婪正则表达式的行为
【发布时间】:2014-06-23 14:14:42
【问题描述】:

我使用的是python 3.4.1版本,我不明白以下常规的结果 表达式:

import re
print(re.match("\[{E=(.*?),Q=(.*?)}\]","[{E=KT,Q=P1.p01},{E=KT2,Q=P2.p02}]").groups())
('KT', 'P1.p01},{E=KT2,Q=P2.p02')

我希望结果是

('KT', 'P1.p01')

但显然是第二个。*? '吃'所有字符,直到最后的'}]'。 我希望在第一个 '}" 字符处停止。

如果我省略了 '[' 和 ']' 字符,则行为与我预期的一样:

print(re.match("{E=(.*?),Q=(.*?)}","{E=KT,Q=P1.p01},{E=KT2,Q=P2.p02}").groups())

('KT', 'P1.p01')

【问题讨论】:

  • 你可以在regex101看到一个正则表达式的解释。

标签: python regex regex-group non-greedy


【解决方案1】:

\] 强制在匹配中出现方括号 - 字符串末尾只有一个方括号。正则表达式引擎必须匹配其他选项。如果您删除它或将其设为可选 (\]?),它将停在最近的 }

【讨论】:

  • 或者你也可以在括号和}之间加上贪婪的.*
【解决方案2】:

您似乎想要的是'{E=' 和下一个逗号',' 之间的所有内容,然后是'Q=' 和下一个右大括号'}' 之间的所有内容。一种表达方式是:

{E=([^,]*),Q=([^}]*)}

这里例如[^,]* 表示“尽可能多的非逗号字符”

示例用法:

>>> import re
>>> re.findall("{E=([^,]*),Q=([^}]*)}", 
               "{E=KT,Q=P1.p01},{E=KT2,Q=P2.p02}")
[('KT', 'P1.p01'), ('KT2', 'P2.p02')]

你可以在this regex101 demo看到完整的解释。

【讨论】:

    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多