hee*_*ayl 4 python regex python-2.7
这是我用来从一串字母数字中分割字母和数字的python代码:
input_string = 'abcdefghijklmnopqrstuvwxyz1234567890'
import re
print re.search('[a-z]*', input_string).group()
print re.search('[0-9]*', input_string).group()
Run Code Online (Sandbox Code Playgroud)
在输出中我得到字母串但没有得到数字串.如果我修改代码如下,则输出显示数字:
print re.search('[0-9]*$', input_string).group()
Run Code Online (Sandbox Code Playgroud)
我习惯了grep
,我发现它的功能类似于re
模块的功能,如果我在shell中运行以下命令,我会得到所需的结果:
echo "abcdefghijklmnopqrstuvwxyz1234567890" | grep "[0-9]*"
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
我建议你使用re.findall
函数(按顺序进行全局匹配)而不是re.search
因为re.search
只返回第一个匹配.
>>> input_string = 'abcdefghijklmnopqrstuvwxyz1234567890'
>>> print re.findall(r'\d+|[a-z]+', input_string)
['abcdefghijklmnopqrstuvwxyz', '1234567890']
Run Code Online (Sandbox Code Playgroud)
而且也不要使用[a-z]*
,它也会返回空字符串.*
将重复前一个令牌零次或多次,其中+
将重复前一个令牌一次或多次.
>>> print re.search(r'\d+', input_string).group()
1234567890
>>> print re.search(r'[a-z]+', input_string).group()
abcdefghijklmnopqrstuvwxyz
Run Code Online (Sandbox Code Playgroud)
为什么第一个工作在第二个失败的地方?
>>> print re.search('[a-z]*', input_string).group()
abcdefghijklmnopqrstuvwxyz
>>> print re.search('[0-9]*', input_string).group()
>>>
Run Code Online (Sandbox Code Playgroud)
*
重复前一个标记零次或多次,即它将匹配在每个不匹配字符之前存在的空字符串.首先[a-z]*
返回,abcdefghijklmnopqrstuvwxyz
因为此子字符串位于开头.如果输入是8abcdefghijklmnopqrstuvwxyz
,它将返回一个空字符串.此行为是因为re.search
功能,它在找到第一个匹配后停止.这里8
与上面的正则表达式不匹配,正如我所说,[a-z]*
正则表达式将匹配之前存在的空字符串8
.
regex = [0-9]*
,string ="abcdefghijklmnopqrstuvwxyz1234567890"
re.search
找到第一场比赛后停止.这里a
没有匹配[0-9]
但[0-9]*
匹配之前存在的空字符串a
因为*
会重复前一个标记零次或多次.这就是为什么在第二种情况下你得到一个空字符串作为输出.
>>> print re.search('[0-9]*$', input_string).group()
1234567890
Run Code Online (Sandbox Code Playgroud)
由于我们添加了行锚点的末尾,因此它将在行尾搜索零个或多个数字.如果它在最后找不到更多数字,它将返回一个空字符串作为匹配.
>>> print re.search('[0-9]*$', '12foo').group()
>>>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2027 次 |
最近记录: |