3.1 分组
括号可以把有联系的多个元素归拢起来,使它们作为一个整体,可以由量词来约束。(一起出现或不出现, 或者出现n次)
3.2 多选结构
多选结构的形式是(...|...)
,在括号内部用竖线|
分隔开多个子表达式,这些子表达式也叫做多选分支(option)。在匹配时,整个多选结构就视为一个元素,只要其中某个子表达式能够匹配,整个多选结构就匹配成功。多个子表达式之间是或的关系。
3.3 引用分组
括号不仅仅能把有联系的元素归拢起来并分组,还有其他的作用——使用括号后,正则表达式会保存每个分组真正匹配的文本,等到匹配完成后,通过group(num)
之类的方法“引用”分组在匹配时捕获的内容。其中num
表示对应括号的编号,括号分组的编号是从左向右计数,从1开始。因为“捕获”了文本,所以这种功能叫做捕获分组(capturing group)。对应的,这种括号叫做捕获型括号。
3.3.1 反向引用
英文中不少单词中都有重叠出现的字母,比如shoot或beep,如果希望检查某个单词是否包含重叠出现的字母,该怎么解决?
3.3.2 各种引用的记法
根据前面的介绍,对分组的引用可能出现在三种场合:
- 在匹配完之后,用
group(num)
之类的方法提取数据 - 在进行正则表达式替换时,用
\num
引用 - 在正则表达式内部,用
\num
引用
3.3.3 命名分组
捕获分组通常用数字编号来标识,但这样有几个问题:
- 数字编号不够直观,虽然规则是“从左到右按照开括号出现的顺序计数”,但括号多了难免混淆
- 引用时不够方便,有可能出现二义性
未解决这类问题,一些语言和工具提供了命名分组(named grouping),可已经它看作另一种捕获分组,但是标识是容易记忆和辨别的名字,而不是数字编号。
3.3.4 非捕获型分组
补充
-
元字符的转义
-
URL Rewrite
-
捕获分组的个数不能是动态变化的——单个正则表达式里有多少个捕获分组,一次匹配成功后,结果中就必然存在多少个对应的元素(捕获分组匹配的文本),如果不能预先规定匹配结果中元素的个数,就不能使用捕获分组。
print(re.findall(r'(\w+\.?)+', 'aaa.bbb.ccc')) # ['ccc'] print(re.findall(r'\w+\.?', 'aaa.bbb.ccc')) # ['aaa.', 'bbb.', 'ccc']
网友评论