我想从字符串中提取字母和数字。
我尝试了这个:
>>> re.findall(r'[a-z]|\d*','a11b4')
['a', '11', 'b', '4', '']
>>> re.findall(r'\d*|[a-z]','a11b4')
['', '11', '', '4', '']
为什么改变正则表达式中替代项的顺序会改变输出?
答案1
这是因为您正在使用\d
with *
。
如果存在[a-z]|\d*
,它会首先尝试匹配a-z
。如果没有,它会尝试匹配 0 个或更多个数字重复。在您的示例中,它会a
首先匹配。
然而,反过来,它会首先尝试匹配 0 个或更多个数字重复。嗯,a
是0 次重复数字,因此它符合“匹配”条件。它不会尝试评估表达式[a-z]
,因为它已经符合 0 次重复条件。
为了正确使用这种模式(特别是如果它有为字母或至少一位数字),你可以改用:
[a-z]|\d+
或者\d+|[a-z]
这将查找某个数字的 1 个或多个重复,无法匹配a
,然后评估[a-z]
,从而得到您期望的响应。