Python正则表达式MULTILINE没有找到任何东西[重复]

Posted

技术标签:

【中文标题】Python正则表达式MULTILINE没有找到任何东西[重复]【英文标题】:Python Regular Expression MULTILINE Not Finding Anything [duplicate] 【发布时间】: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。我在这里错过了什么?

【问题讨论】:

【参考方案1】:

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

而here 是对 Python 的大部分正则表达式功能的更温和(我认为)通常更好的介绍。

【讨论】:

【参考方案2】:

来自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

【讨论】:

【参考方案3】:

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

search() vs. match():

Python 提供了两种不同的基于常规的原始操作 表达式:re.match() 仅在 开始 处检查匹配项 字符串,而re.search() 检查匹配 anywhere 在 字符串(这是 Perl 默认所做的)。

【讨论】:

以上是关于Python正则表达式MULTILINE没有找到任何东西[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python:正则表达式re模块

python 正则

python中常用的正则表达式符号

python 正则表达式特殊字符

Python_Re模块&正则表达式

Pyhon 正则表达式