|
|

楼主 |
发表于 2017-9-2 11:08:12
|
显示全部楼层
ooo,我懂了,我来总结一下:
非捕获组的结构是(?:X),其中X是正则表达式
拓展一下,有4种非捕获组:
1.(?=X) 表示肯定前向查找,即在当前位置右边匹配时才可继续匹配
当(?=X) 在其他正则表达式后面时:
- p = re.findall(r'[0-9a-z]{2}(?=ab)','ab00ab11ab33')
- print(p)
- ['00', '11']
复制代码
表示任意2个字母或数字后如果有ab则匹配,这里的00ab和11ab,但是由于ab是非捕获组,因此不输出ab,只输出前面匹配的内容00 和11
当(?=X) 在其他正则表达式前面时:
- p = re.findall(r'(?=hopeful)hope','this is a hopeful hope')
- >>> print(p)
- ['hope']
复制代码
表示查找字符串'this is a hopeful hope'中是否匹配hopeful,如果匹配,则输出hope,同理,在
- p = re.findall(r'(?=ab)[0-9a-z]{2}','ab00ab11ab33')
- >>> print(p)
- ['ab', 'ab', 'ab']
复制代码
中,查找'ab00ab11ab33'中是否匹配ab,若匹配,输出ab
2.(?<=X) 表示肯定后向查找,即X在此位置左边匹配时才可继续查找
- m = re.findall(r'(?<=ab)[0-9a-z]{2}','abcdabcdab')
- >>> print(m)
- ['cd', 'cd']
复制代码
这里匹配1-4个字符abcd,和5-8个字符abcd,但是ab是非捕获组,因此不打印出来,输出cd,cd
但是,当(?<=X)放到其他正则表达式后面:
- m = re.findall(r'[0-9a-z]{2}(?<=ab)','abcdabcdab')
- >>> print(m)
- ['ab', 'ab', 'ab']
复制代码
指定[0-9a-z]{2}中就是ab,即字符串中存在ab才可以匹配
- m = re.findall(r'ab(?<=ab)','abcdabcdab')
- >>> print(m)
- ['ab', 'ab', 'ab']
复制代码
这样也是可以的,但是
- m = re.findall(r'abcd(?<=ab)','abcdabcdab')
- >>> print(m)
- []
复制代码
这样就不可以,因为前面的正则表达式不可以被指定为ab,因此不可以匹配,这样看来(?<=X)一般是放到前面使用,放到后面时没有什么意义的
3.(?!X) 前向否定查找
4.(?<!X) 后向否定查找
这两个和前面的不同就是不匹配X即可 |
|