我把头发拉过来...假设我有以下字符串:“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'[a-z]*'
;这也没有解决它。
答案 0 :(得分:3)
*
匹配零次或多次。想想在第一个角色之前的位置" 113abc"那是零次!如此匹配。
答案 1 :(得分:1)
这是获得所需输出的最简单方法
import re
s = "123abc"
m = re.search('[a-z]+', s)
print(m.group(0))
它也适用于您的原始数字正则表达式和输出' 123'如果你只是更换分隔符。 +匹配1个或更多,这更符合你想要的。
答案 2 :(得分:0)
要查看行为上的差异,请查看正则表达式findall
的输出:
>>> print re.findall('[a-z]*', s)
['', '', '', 'abc', '']
>>> print re.findall('[0-9]*', s)
['123', '', '', '', '']
正如您在[a-z]*
中看到的那样,我们在匹配abc
之前得到3个空匹配,这是search
返回空的原因,因为它返回第一个匹配。
您正在使用[a-z]*
(0次或多次出现[a-z]
)它甚至匹配一个空字符串。因此,前3个字母1
,2
,3
和字符串末尾的另一个空匹配会获得3个空匹配。
但是对于第二种情况,因为第一次匹配是123
,我们会得到search
函数返回的相同内容。
当我们使用+
量词行为更改时:
>>> print re.findall('[0-9]+', s)
['123']
>>> print re.findall('[a-z]+', s)
['abc']
因此返回两个正则表达式的单一匹配,因为现在无法进行空匹配。