[英]python regular expression works on numbers but not letters?
我正在为此做准备...假设我有以下字符串:“ 123abc”,并想在python 2.7中对其进行正则表达式。 如果我做:
import re
s = "123abc"
m = re.search('[0-9]*', s)
print(m.group(0))
它的行为完全符合预期,并显示“ 123”。
但是,如果我想这样做:
import re
s = "123abc"
m = re.search('[a-z]*', s)
print(m.group(0))
它只显示“”->空字符串。
为什么? 如何使其与角色配合使用?
还要注意,如果我删除星号,它可以使用字母(例如group(0)
是a
)。 是的,我也尝试过r'[az]*'
; 那也不能解决。
*
匹配零次或多次。 想想“ 113abc”中第一个字符之前的位置,那里的位置是零倍! 如此搭配。
这是获得所需输出的最简单解决方案
import re
s = "123abc"
m = re.search('[a-z]+', s)
print(m.group(0))
如果您只是替换定界符,它也适用于您原始的数字正则表达式并输出'123'。 +匹配1个或更多,更符合您的要求。
要查看行为上的差异,让我们看看两个正则表达式的findall
输出:
>>> print re.findall('[a-z]*', s)
['', '', '', 'abc', '']
>>> print re.findall('[0-9]*', s)
['123', '', '', '', '']
如您在[az]*
看到的,在匹配abc
之前我们得到3个空匹配,这是search
返回空的原因,因为它返回了第一个匹配。
您正在使用[az]*
(0或多次出现的[az]
甚至一个空字符串相匹配。 所以我们得到3场空比赛为前3个字母1
, 2
, 3
,在字符串的结尾另一个空匹配。
但是对于第二种情况,由于第一个匹配为123
,因此search
功能返回的结果相同。
当我们使用+
量词时,行为会更改为:
>>> print re.findall('[0-9]+', s)
['123']
>>> print re.findall('[a-z]+', s)
['abc']
因为两个空表达式现在不可能,所以返回两个正则表达式的单个匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.