Python非贪婪正则表达式的行为

时间:2014-06-23 14:14:42

标签: python regex regex-group non-greedy

我正在使用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')

2 个答案:

答案 0 :(得分:4)

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

答案 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中看到完整说明。