我有一个像
这样的字符串line = "... ... constant0 username@domain\r"
我需要提取域名
matchObj = re.match( 'constant\d+\s+(\w+)\@(\w+)', line, re.M|re.I)
matchObj
始终返回None
。我在这里失踪的是什么?
答案 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.match
,re.match
用于匹配字符串的开头。
Python提供了两种基于常规的基本操作 表达式:
re.match()
仅在开头检查匹配项 该字符串,而re.search()
检查匹配任何地方 string(这是Perl默认执行的操作)。
答案 2 :(得分:1)
re.match
仅匹配字符串的开头。 re.search
匹配任何地方。根据{{3}},不要只在re.match的开头添加.*
,使用re.search
进行优化! (re.search
在c中快速循环以仅检查与第一个字符匹配的字符串部分。如果它以不明确的字符开头,则必须一直到字符串的末尾并回溯。)
而且docs更温和,而且(我认为)通常会更好地介绍Python的大部分正则表达式功能。