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.match
,re.match
用于匹配字符串的开头。
search() vs. match():
Python 提供了两种不同的基于常规的原始操作 表达式:
re.match()
仅在 开始 处检查匹配项 字符串,而re.search()
检查匹配 anywhere 在 字符串(这是 Perl 默认所做的)。
【讨论】:
以上是关于Python正则表达式MULTILINE没有找到任何东西[重复]的主要内容,如果未能解决你的问题,请参考以下文章