如何使用Python的正则表达式匹配下划线?

4

我在使用Python正则表达式匹配下划线字符时遇到了问题。在shell中测试,结果如下:

>>> import re
>>> re.match(r'a', 'abc')
<_sre.SRE_Match object at 0xb746a368>
>>> re.match(r'_', 'ab_c')
>>> re.match(r'[_]', 'ab_c')
>>> re.match(r'\_', 'ab_c')

我本来期望其中至少有一个能够返回匹配对象。我是做错了什么吗?

5
如果字符串的开头有匹配项,re.match会返回匹配结果。建议使用re.search - rock321987
谢谢,我没有意识到。 - scottmsul
re.match(r'.*\_.*', string) 是什么意思? - MaxNoe
2个回答

6
如果你正在查找的模式不在搜索字符串的开头,则应使用re.search而不是re.match

re.match(pattern, string, flags=0)

尝试在字符串开头应用模式,返回匹配对象,如果未找到匹配项则返回None。

re.search(pattern, string, flags=0)

扫描字符串以查找与模式匹配的内容,返回匹配对象,如果未找到匹配项则返回None。

您无需转义_甚至使用原始字符串。
>>> re.search('_', 'ab_c')
Out[4]: <_sre.SRE_Match object; span=(2, 3), match='_'>

4
尝试以下操作:
re.search(r'\_', 'ab_c')

你确实是对的,需要避免使用下划线字符!请注意,您只能在字符串开头使用match,正如文档中所清楚说明的那样(https://docs.python.org/2/library/re.html):
如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的MatchObject实例。 如果字符串不匹配模式,则返回None; 请注意,这与零长度匹配不同。
在这种情况下,您应该使用search
扫描字符串,查找正则表达式模式产生匹配的第一个位置,并返回相应的MatchObject实例。 如果字符串中没有位置与模式匹配,则返回None; 请注意,这与在字符串某些位置找到零长度匹配不同。

2
这里的问题不在于转义下划线,而是OP正在使用“match”,而他们想要的是“search”。 - Nolen Royalty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接