2015-07-06 3 views
1

У меня есть куча строк в файле с одним или двумя вхождений той же схеме (ID =):Python Regular Expression. Matching один или два раза шаблон

Linetype1 : ...id=1234...id=4321...value=5678... # "..." means whatever 
Linetype2 : ...id=7890...value=8765 

Я думал, что я мог бы написать такое регулярное выражение Grep все мои идентификаторы и соответствующие значения:

>>> l="...id=1234...id=4321...value=5678...\n...id=7890...value=8765\n" 
>>> ret = re.findall('(id=[0-9]+).*?(id=[0-9]+)*.*?(value=[0-9]+)',l) 
[('id=1234', '', 'value=5678'), ('id=7890', '', 'value=8765')] 

Я не могу получить вторую часть «id = 4321». Мне это очень странно, так как я использую неживые. *? между первым id = [0-9] + и вторым.

ответ

0

Середина вашего регулярное выражение имеет

(id=[0-9]+)* 

пустая строка соответствует этому, так как он находится под Клини звездой *. Таким образом, регулярное выражение двигатель протекает через строку следующим образом:

  • найти первую id=[0-9]+ группы
  • расширить .*? в пустую строку, так как он соответствует
  • расширить (id=[0-9]+) * в пустую строку, так как он соответствует
  • расширить .*? к остальной части строки

Если заменить квантор средней группы с +, или просто удалить его целиком, то он работает.

+0

Да, но он больше не соответствует типу lin2 –