2

我有一个字符串

line = "... ... constant0 username@domain\r"

我需要提取域

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

matchObj 总是回来None。我在这里缺少什么?

4

3 回答 3

6

从上的文档re.match

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

如果您想在字符串中的任何位置找到匹配项,请改用search()(另请参阅search() 与 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
于 2013-08-15T09:39:59.567 回答
1

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

search() 与 match()

Python 基于正则表达式提供了两种不同的原始操作:re.match()仅在字符串的开头检查匹配,而在字符串中的任何位置re.search()检查匹配(这是 Perl 默认所做的)。

于 2013-08-15T09:39:18.530 回答
1

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

这是对 Python 的大多数正则表达式功能的更温和且(我认为)通常更好的介绍

于 2013-08-15T09:41:16.187 回答