这是我用来从一串字母数字中拆分字母和数字的 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 之前存在的空字符串。

正则表达式 = [0-9]* ,字符串 = "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/

10-11 18:26