python - 了解 Python 中的 're.search()' 行为

标签 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()

在输出中,我得到的是字母串,但没有得到数字串。如果我像下面这样修改代码,输出显示数字:

print re.search('[0-9]*$', input_string).group()

我习惯了 grep 并且我发现它的功能与 re 模块的功能相似,如果我在 shell 中运行以下命令我会得到想要的结果:

echo "abcdefghijklmnopqrstuvwxyz1234567890" | grep "[0-9]*"

我是不是漏掉了什么?

最佳答案

我建议您使用 re.findall 函数(为了进行全局匹配)而不是 re.search 因为 re.search 将只返回第一个匹配项。

>>> input_string = 'abcdefghijklmnopqrstuvwxyz1234567890'
>>> print re.findall(r'\d+|[a-z]+', input_string)
['abcdefghijklmnopqrstuvwxyz', '1234567890']

也不要使用[a-z]*,它也会返回空字符串。 * 会重复前一个标记零次或多次,而 + 会重复前一个标记一次或多次。

>>> print re.search(r'\d+', input_string).group()
1234567890
>>> print re.search(r'[a-z]+', input_string).group()
abcdefghijklmnopqrstuvwxyz

为什么第一个有效而第二个失败?

>>> print re.search('[a-z]*', input_string).group()
abcdefghijklmnopqrstuvwxyz
>>> print re.search('[0-9]*', input_string).group()

>>>

* 重复前一个标记零次或多次,即它会匹配每个不匹配字符之前存在的空字符串。首先 [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

由于我们添加了行尾 anchor ,它会在行尾搜索零个或多个数字。如果在最后找不到更多数字,它将返回一个空字符串作为匹配项。

>>> print re.search('[0-9]*$', '12foo').group()

>>> 

关于python - 了解 Python 中的 're.search()' 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28249872/

相关文章:

python - 为什么 BeautifulSoup 不显示 HTML 中的标题

python - 为什么嵌套字典可以但禁止嵌套集?

python - 有没有什么方法可以匹配以一个字符串开头但*不*以另一个字符串开头的正则表达式?

java - 在 Java 正则表达式中匹配 A 但不匹配 B?

c# - 需要 RegEx 从字符串中删除所有字母

python-2.7 - 不同版本的 Python 2.7 和 Numpy 对同一脚本产生不同的结果

python - 从 .txt 读取行,如果第一个和最后一个字符等于 X 和 Y,则在该字符串后添加一些文本

python - 无法使用python脚本在字典中输入字符

python - BeautifulSoup:如何在特定的 html 标签后提取数据

python - 预计 volv1d_1 的形状是多少