python re.findall奇怪的行为

时间:2013-04-09 16:35:00

标签: python regex 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文档说明了以下内容:

  

(点。)在默认模式下,它匹配除a以外的任何字符   新队。如果指定了DOTALL标志,则匹配任何标志   字符包括换行符。

我的问题是,如果这确实是预期的行为或错误。 如果预计有人请解释为什么这些行匹配以及我应该如何修改我的模式以获得我期望的行为:

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

1 个答案:

答案 0 :(得分:6)

\s字符类而言,换行符也是空格。如果您只想匹配空格,则需要匹配[ ]

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