Python正则表达式MULTILINE没有找到任何东西

时间:2013-08-15 09:37:47

标签: python regex

我有一个像

这样的字符串
line = "... ... constant0 username@domain\r"

我需要提取域名

matchObj = re.match( 'constant\d+\s+(\w+)\@(\w+)', line, re.M|re.I)

matchObj始终返回None。我在这里失踪的是什么?

3 个答案:

答案 0 :(得分:6)

来自re.match上的文档:

  

请注意,即使在MULTILINE模式下,re.match()也只会匹配字符串的开头而不是每行的开头。

     

如果您想在字符串中的任意位置找到匹配项,请改用search()(另请参阅search() vs. match())。

re.match()在字符串中的任何位置找不到匹配项,而re.search()则会找到匹配项。您将需要使用re.search()(大部分时间)。

观察:

>>> import re
>>> line = "... ... constant0 username@domain\r"
>>> matchObj = re.match( 'constant\d+\s+(\w+)\@(\w+)', line, re.M|re.I)
>>> matchObj # None
>>> matchObj = re.search('constant\d+\s+(\w+)\@(\w+)', line, re.M|re.I)
>>> matchObj
<_sre.SRE_Match object at 0x10ce84470>
>>> print matchObj.group(0)
constant0 username@domain
>>> print matchObj.group(1)
username

答案 1 :(得分:1)

使用re.search而非re.matchre.match用于匹配字符串的开头。

search() vs. match()

  

Python提供了两种基于常规的基本操作   表达式:re.match()仅在开头检查匹配项   该字符串,而re.search()检查匹配任何地方   string(这是Perl默认执行的操作)。

答案 2 :(得分:1)

re.match仅匹配字符串的开头。 re.search匹配任何地方。根据{{​​3}},不要只在re.match的开头添加.*,使用re.search进行优化! (re.search在c中快速循环以仅检查与第一个字符匹配的字符串部分。如果它以不明确的字符开头,则必须一直到字符串的末尾并回溯。)

而且docs更温和,而且(我认为)通常会更好地介绍Python的大部分正则表达式功能。