[英]Behaviour of Python non-greedy regular expression
我正在使用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')
\\]
强制在比赛中出现一个方括号-字符串的末尾只有一个。 正则表达式引擎必须与其他选项匹配。 如果将其删除或使其成为可选项( \\]?
则它停在最接近的}
。
您似乎想要的是'{E='
和下一个逗号','
之间'Q='
所有内容,然后是'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')]
您可以在此regex101演示中看到完整的说明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.