编辑
2024-08-15
Python
0
请注意,本文编写于 247 天前,最后修改于 247 天前,其中某些信息可能已经过时。

目录

前言
正则表达式扩展语法
递归

前言

书接上回,python中官方提供的正则表达式库为re,引入项目只需要

python
import re

但是re仅仅支持一些基础的正则表达式语法,对于高级的扩展语法并没有支持。但是第三方库regex对这些提供了支持。安装regex需要

shell
pip install regex

然后在项目中引入即可使用

python
import regex

正则表达式扩展语法

递归

如果希望匹配嵌套的括号,如

aaa{bbb{ccc}}

如果仅仅匹配{},匹配将会在第一个}停止,得到{bbb{ccc}。显然这并不是期望的结果,因而排除中间的括号

python
r'{[^{}]*}'

这样就不会出现括号不完整的情况了,然而如此就仅仅能匹配到一个括号,无法匹配到括号嵌套的文本,如

{aaa} {bbb} ...

是可以被匹配到的,但是{aaa{bbb}}是不能被匹配的

对于这种嵌套的结构,应该采取递归的方法

python
r'{([^{}]+|(?0))*}'

下面做必要的解释说明

  • 最外面的{...}匹配一对大括号
  • 大括号内部的(...)*定义了一个捕获组,并允许它重复多次
  • 捕获组内部由|分为两段分支
    • [^{}]+匹配了不含括号的非空字符串
    • (?0)递归调用整个正则表达式

思路可以分析如下。首先定义了一个基本的单元

{[^{}]+}

它匹配一对无嵌套的大括号。若希望令它可以嵌套自身,引入递归

{[^{}]+|(?0)}

这样它就能匹配{{aaa}}这样的嵌套大括号了,但是它并不能匹配{aaa{bbb}ccc}这样的字符串,因为这个正则表达式要求大括号内部是不含括号的部分或是另一对大括号,并不允许这两种情况同时出现,因而需要允许内部结果重复

{([^{}]+|(?0))*}

在匹配{aaa{bbb}}这个字符串时,大括号被正则表达式最外层的{}匹配上,内部的字符串需要满足的条件为

([^{}]+|(?0))*

aaa满足[^{}]+{bbb}满足(?0),它们都能满足([^{}]+|(?0)),那么aaa{bbb}就能满足该捕获组的重复

如此就实现了嵌套大括号的匹配

本文作者:GBwater

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!