python正则表达式适用于数字但不适用于字母?

时间:2018-05-21 21:23:51

标签: python regex 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'[a-z]*';这也没有解决它。

3 个答案:

答案 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个字母123和字符串末尾的另一个空匹配会获得3个空匹配。

但是对于第二种情况,因为第一次匹配是123,我们会得到search函数返回的相同内容。

当我们使用+量词行为更改时:

>>> print re.findall('[0-9]+', s)
['123']
>>> print re.findall('[a-z]+', s)
['abc']

因此返回两个正则表达式的单一匹配,因为现在无法进行空匹配。