странное поведение python re.findall

>>> 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 говорится следующее:

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

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

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

person ZergRush    schedule 09.04.2013    source источник
comment
новая строка может быть включена в \s с re.MULTILINE ... я думаю, по крайней мере   -  person Joran Beasley    schedule 09.04.2013


Ответы (1)


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

>>> re.findall("^\s*xyxyxy[ ]+([a-z0-9]+).*$", text, re.MULTILINE)
[u'testmatch0', u'testmatch1', u'testmatch2', u'testmatch3']
person Martijn Pieters    schedule 09.04.2013
comment
ба, ты быстрее: P как всегда (спасибо за информацию о моем ответе :)) - person Joran Beasley; 09.04.2013