作为一个学习练习,我喜欢比较两个做同样事情的正则表达式。
在这种情况下,我想从字符串中提取数字序列,如下所示:
CC_nums=[
'2341-3421-5632-0981-009',
'521-9085-3948-2543-89-9'
]
在正则表达式中捕获后的正确结果将是
['2341', '3421', '5632', '0981', '009']
['4521', '9085', '3948', '2543', '89', '9']
我知道这适用于python
:
for number in CC_nums:
print re.findall('(\d+)',number)
但是,为了更深入地理解这一点,我尝试了以下内容:
for number in CC_nums:
print re.findall('\s*(?:(\d+)\D+)+(\d+)\s*', number)
..返回:
[('0981', '009')]
[('89', '9')]
两个问题:
首先,为什么第二个返回元组而不是列表?
其次,为什么第二个数字与其他数字组不匹配,例如2341
,3241
等?
我知道findall
将返回非重叠捕获组,所以我试图避免这种情况。由于(\d+)
,捕获组不重叠,因此我认为这不是问题。
答案 0 :(得分:3)
请参阅Python re.findall behaves weird,了解re.findall
返回元组列表的原因。基本上,它返回一个元组,因为模式中有多个捕获组。
正则表达式返回最后一位数字子字符串,因为+
量词应用于(?:(\d+)\D+)
组,因此,每次此子模式捕获一个子字符串时,前一个被替换为新的子字符串一组在缓冲区中。