Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python正则表达式可以处理数字,但不能处理字母?_Python_Regex_Letters - Fatal编程技术网

python正则表达式可以处理数字,但不能处理字母?

python正则表达式可以处理数字,但不能处理字母?,python,regex,letters,Python,Regex,Letters,我在为这件事发愁。。。假设我有以下字符串:“123abc”,并希望在Python2.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)) 它只打印“->空字符串 为什么??我如何让

我在为这件事发愁。。。假设我有以下字符串:“123abc”,并希望在Python2.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)
,例如,is
a
)。是的,我也试过
r'[a-z]*'
;这也不能解决问题

*
匹配零次或多次。想想“113abc”中第一个字符前面的位置,它是零次!如此匹配。

*
匹配零次或多次。想想“113abc”中第一个字符前面的位置,它是零次!如此匹配。

这是获得所需输出的最简单修复方法

import re
s = "123abc"
m = re.search('[a-z]+', s)
print(m.group(0))

它也适用于原始的数字正则表达式,如果只替换分隔符,则输出“123”。+匹配1个或多个更符合您需要的内容

这是获得所需输出的最简单的修复方法

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', '', '', '', '']
正如您在
[a-z]*
中所看到的,我们在匹配
abc
之前得到了3个空匹配项,这就是
搜索返回空匹配项的原因,因为它返回第一个匹配项

您正在使用
[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']

因此,对于这两个正则表达式,我们将返回单个匹配项,因为现在不可能有空匹配项。

要查看行为上的差异,让我们看看这两个正则表达式的
findall
输出:

>>> print re.findall('[a-z]*', s)
['', '', '', 'abc', '']

>>> print re.findall('[0-9]*', s)
['123', '', '', '', '']
正如您在
[a-z]*
中所看到的,我们在匹配
abc
之前得到了3个空匹配项,这就是
搜索返回空匹配项的原因,因为它返回第一个匹配项

您正在使用
[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']

因此,返回两个正则表达式的单个匹配,因为现在不可能有空匹配。

*
为零或更多。或者更好的解释为多或零。
*
为零或更多。或者更好的解释为多或零。啊,我明白了。所以,如果不是开头,我必须使用+?是的,你需要考虑空字符串,它应该匹配吗?如果你真的只想在至少有1个数字或alpha时匹配,你需要使用“+”。啊,我明白了。所以,如果不是开头,我必须使用+?是的,你需要考虑空字符串,它应该匹配吗?如果您确实只想在至少有1个数字或alpha时进行匹配,则需要使用“+”。