Поведение не жадного регулярного выражения Python

Я использую 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 ответа

\] Заставляет квадратную скобку присутствовать в матче - и в конце строки есть только один. Двигатель регулярных выражений должен соответствовать другим параметрам. Если вы удалите его или сделаете необязательным (\]?), Он остановится ближе }.


То, что вам кажется нужным, - это все между '{E=' и следующей запятой ',', затем все между 'Q=' и следующей закрывающей скобкой '}'. Одним из выражений для этого было бы следующее:

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

Здесь eg [^,]* означает "как можно большее количество символов не запятой".

Пример использования:

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

Вы можете увидеть полное объяснение в этой демонстрации regex101.

licensed under cc by-sa 3.0 with attribution.