2013-04-09 5 views
1
>>> text =\ 
... """xyxyxy testmatch0 
... xyxyxy testmatch1 
... xyxyxy 
... whyisthismatched1 
... xyxyxy testmatch2 
... xyxyxy testmatch3 
... xyxyxy 
... whyisthismatched2 
... """ 
>>> re.findall("^\s*xyxyxy\s+([a-z0-9]+).*$", text, re.MULTILINE) 
[u'testmatch0', u'testmatch1', u'whyisthismatched1', u'testmatch2', u'testmatch3', u'whyisthismatched2'] 

Так что мои ожидания состоят в том, чтобы не соответствовать строкам, содержащим «whyisthismatched».python re.findall weird behavior

Питон повторно документации говорится следующее:

(. Dot) В режиме по умолчанию, это соответствует любому символу, за исключением новой строки. Если флаг DOTALL указан, это соответствует любому знаку , включая новую строку.

Мой вопрос будет, если это действительно ожидаемое поведение или ошибка. Если ожидаются, кто-то пожалуйста, объясните, почему эти линии сопоставления и как я должен изменить свой шаблон, чтобы получить поведение я ожидаю:

[u'testmatch0', u'testmatch1', u'testmatch2', u'testmatch3'] 
+0

новой строки могут быть включены в \ s с re.MULTILINE ... Я думаю, что по крайней мере –

ответ

6

Newlines является пробельными слишком, насколько класс \s характера обеспокоен. Если вы хотите, чтобы соответствовать пространства только вы должны соответствовать [ ] вместо:

>>> re.findall("^\s*xyxyxy[ ]+([a-z0-9]+).*$", text, re.MULTILINE) 
[u'testmatch0', u'testmatch1', u'testmatch2', u'testmatch3'] 
+0

BAh ваш быстрее: P как всегда (спасибо для информации по моему ответу :)) –

+0

Я только что понял, спасибо за быструю помощь. – ZergRush