Python.re.findall() 里面的 非捕获 (?:) 问题 “体验”!

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】 这样  非捕获  再对比看看


 

你可能感兴趣的:(Python.re.findall() 里面的 非捕获 (?:) 问题 “体验”!)