【发布时间】:2013-08-17 11:38:40
【问题描述】:
我有一个类似
的字符串line = "... ... constant0 username@domain\r"
我需要提取域名
matchObj = re.match( 'constant\d+\s+(\w+)\@(\w+)', line, re.M|re.I)
matchObj 总是返回None。我在这里错过了什么?
【问题讨论】:
我有一个类似
的字符串line = "... ... constant0 username@domain\r"
我需要提取域名
matchObj = re.match( 'constant\d+\s+(\w+)\@(\w+)', line, re.M|re.I)
matchObj 总是返回None。我在这里错过了什么?
【问题讨论】:
来自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
【讨论】:
使用re.search 而不是re.match,re.match 用于匹配字符串的开头。
Python 提供了两种不同的基于常规的原始操作 表达式:
re.match()仅在 开始 处检查匹配项 字符串,而re.search()检查匹配 anywhere 在 字符串(这是 Perl 默认所做的)。
【讨论】: