簡體   English   中英

Python非貪婪正則表達式的行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM