正则表达式中替代项的顺序重要吗?

正则表达式中替代项的顺序重要吗?

我想从字符串中提取字母和数字。

我尝试了这个:

>>> re.findall(r'[a-z]|\d*','a11b4')
['a', '11', 'b', '4', '']
>>> re.findall(r'\d*|[a-z]','a11b4')
['', '11', '', '4', '']

为什么改变正则表达式中替代项的顺序会改变输出?

答案1

这是因为您正在使用\dwith *

如果存在[a-z]|\d*,它会首先尝试匹配a-z。如果没有,它会尝试匹配 0 个或更多个数字重复。在您的示例中,它会a首先匹配。

然而,反过来,它会首先尝试匹配 0 个或更多个数字重复。嗯,a 0 次重复数字,因此它符合“匹配”条件。它不会尝试评估表达式[a-z],因为它已经符合 0 次重复条件。

为了正确使用这种模式(特别是如果它为字母或至少一位数字),你可以改用:

[a-z]|\d+或者\d+|[a-z]

这将查找某个数字的 1 个或多个重复,无法匹配a,然后评估[a-z],从而得到您期望的响应。

相关内容