用圆括号建组。Python的re库里面对圆括号做了比较清晰讲解,一对圆括号()和正则表达式一起使用时可以实现以下任意一个(或两个)功能:
1. 对正则表达式进行分组
2. 匹配分组
有时你需要对正则表达式进行分组,其中一个很好的例子就是,你要用两个不同的正则表达式去比较一个字符串。另一个理由是为整个正则表达式添加一个重复操作符。
使用圆括号的一个额外好处就是匹配的子串会被保存到一个子组,便于今后使用。这个子组可以在同一次匹配或搜索中被重复调用,或被提取出来做进一步处理。
为什么需要子组匹配呢?主要是有时除了进行匹配操作外,你还想要提取匹配模式的内容。如果想知道在成功的匹配中,是哪些字符串匹配了我们的正则表达式模式。
如果要对()做更实用的功能分类:
1. 限定多选结构的范围,如:ab(c|d|e)fgh
2. 标注量词作用的元素,如:ab(cde)+fgh
3. 为引用捕获文本,作为这个用法,加括号是为了返回或引用匹配结果
其实1和2很简单,但是3就有点难以理解了。。“匹配的子串会被保存到一个子组,便于今后使用”,这句话到底怎么理解呢?什么又是反向引用?
经过查询及测试,才豁然开来,原来这么简单又有趣呀!
原来,加了圆括号()以后,圆括号里的模式匹配的内容都会被捕获,并且会按照圆括号的顺序进行编号。
比如,当我使用([a-zA-Z](\d{2}))((-)\d{3})来进行正则匹配”B33-888”时,匹配情况如下:
编号group1:B33
编号group2:33
编号group3:-888
编号group4:-
这就是:匹配的子串会被保存到一个子组,便于今后使用。
那么可以怎么使用呢,这里就可以反向引用了!
能够体现反向引用的便利性的一种情况就是找到句子中重复的单词。
比如:([a-zA-Z](\d{2}))((-)\d{3}) +\1\3,则代表可以匹配“B33-888 B33-888”类似重复的情况了,其中\1就是group1代表B33,\3就是group3代表-888。我们通过\1和\3引用了之前圆括号中捕获到的内容,并用于匹配,这就是反向引用。