Python.re.findall() 里面的 非捕获 (?:) 问题 “体验”!
写给自己看的,路过的人想看懂的话,就把【1】-【19】对比敲一下应该能看出式子的不同。大神请无视。
import re
x = "1234567"
re.sub(r'(?=(\d{3})+$)',',',x)
'1,234,567' 【1】这个符合预期
re.findall(r'(?=(\d{3})+$)',x)
['567', '567'] 【2】这个看不懂
re.sub(r'(?=(?:\d{3})+$)',',',x)
'1,234,567' 【3】因为【1】里面的sub是相当于【3】(使用了“(?:)“这个非捕获)
re.findall(r'(?=(?:\d{3})+$)',x)
['', ''] 【4】对findall 也用(?:)
re.findall(r'(\d)(?=(\d{3})+$)',x)
[('1', '567'), ('4', '567')] 【5】加入对比的分组(\d)
re.findall(r'(\d)(?=(?:\d{3})+$)',x)
['1', '4'] 【6】体会下非捕获的作用
re.findall(r'(?=(\d{4})+$)',x)
['4567'] 【7】这里又为什么不是 ['4567', '4567']。
re.findall(r'(\d{3})+$',x)
['567'] 【8】这里为什么不返回‘234567’
对于【7】【8】,因为findall 是对整个式子r'(\d{3})+$'去匹配寻找,但是找到的内容并没有被分组,所以不保留。而是进行第二次匹配,在结果中找分组(\d{3})的目标内容。 如果整个式子被加上()也进行分组就不一样了。
re.findall(r'((\d{3})+$)',x)
[('234567', '567')] 【9】这个加多了一组外围()的【8】
re.findall(r'(?=(?:\d{3})+$)',x)
['', ''] 【10】将分组非捕获看看
re.findall(r'(\d{1,3})(?=(?:\d{3})*$)',x8)
['12', '345', '678'] 【11】 对目标数字串,从后面开始找出三个三个的数
re.findall(r'(\d)(?=(\d{3})+$)',x)
[('1', '567'), ('4', '567')] 【12】 找出后面跟着三个三个数的一个数,并且体会一下没有使用 “非捕获”
re.findall(r'(\d)(?=(?:\d{3})+$)',x)
['1', '4'] 【13】 对【12】用“非捕获”
re.findall(r'(\d{1,3})',x)
['123', '456', '7'] 【14】从前面开始三个三个数地找出来
re.findall(r'(\d{3})',x)
['123', '456'] 能理解
re.findall(r'\d{3}',x)
['123', '456'] 能理解 【15】只有最外面一个分组等于没分组
re.findall(r'(\d{3})+',x)
['456'] 【16】 ()+ 在这里是什么作用呢
多次重复的话为什么不返回 ['123456']呢
答:其实找出来了,但因为没有被()分组,所以被抛弃,findall只找出()里面的(\d{3})
()+ 在这里是组合使用,()\d\d\d 与 ()+ 与(\d{3})(\d{3})(\d{3})。。。都是作为匹配的式子去用,但用它匹配出来结果后,就开始取其中分组所要的内容,而这个式子就没有保留。
re.findall(r'(\d{2})+',x)
['56'] 【17】同理,是匹配了很多 “\d{2} ” 但只取 (\d{2}) 这个被分组的保留显示
re.findall(r'((\d{2})+)',x)
[('123456', '56')] 【18】 对外面式子分组,得到对比看看
re.findall(r'((?:\d{2})+)',x)
['123456'] 【19】 这样 非捕获 再对比看看