Python re.sub 反向引用的实现

作者:Tsonglew 时间:2022-07-26 11:25:21 

目录
  • match 分组

  • re.sub 匹配和替换

  • 反向引用

  • 参考

re 模块是 Python 标准库中提供的用于处理正则表达式的模块,利用 re 模块可以方便的利用正则表达式实现字符串中的匹配、替换等操作

match 分组

Python re 模块中提供了 match 函数,用来匹配字符串中指定的正则表达式规则。例如,如果想匹配到 "Isaac Newton, physicist" 中的 Isaac Newton,则可以使用正则表达式 \w+ \w+ ,运行结果如下:


>>> m = re.match("\w+ \w+", "Isaac Newton, physicist")
>>> m
<re.Match object; span=(0, 12), match='Isaac Newton'>

re.match 的第一个参数是指定的正则表达式规则,第二个参数是待匹配的字符串。正则表达式规则 \w+ 表示匹配一段连续的字符,要求匹配到的字符数量大于 1。 \w+ \w+ 就表示匹配两段连续的字符,且两段字符中间用空格隔开

使用 match 执行匹配时会对匹配到的结果进行 分组 ,可以通过 match 返回结果的 group() 接口查看分组结果


>>> m.group(0)
'Isaac Newton'

默认情况下, match 只会产生一个分组,就是第 0 个分组,表示整个匹配到的内容。对于上面的例子,第 0 个分组就是 \w+ \w+ 匹配到的完整的内容,也就是 Issac Newton 。
使用正则表达式中的括号 () 可以手动指定匹配的分组。例如如果想把 Issac 和 Newton 做为两个分组,那么可以将正则表达式改为 (\w+) (\w+) :


>>> m = re.match("(\w+) (\w+)", "Isaac Newton, physicist")

在 (\w+) (\w+) 这个正则表达式中,指定了两个分组,这两个分组匹配的内容都是 \w+ ,并且两个分组之间用空格隔开。
使用 groups() 可以查看匹配结果中的所有分组 :


>>> m.groups()
('Isaac', 'Newton')

也可以使用 group() 接口分别查看每一个分组,其中 group(0) 仍然表示完整的匹配结果, group(1) 表示匹配结果中的第 1 个分组, group(2) 表示第 2 个分组,以此类推:


>>> m.group(0)
'Isaac Newton'
>>> m.group(1)
'Isaac'
>>> m.group(2)
'Newton'

re.sub 匹配和替换

re.match() 函数提供了正则表达式的匹配接口, re.sub() 不光能匹配正则表达式,还能替换字符串中的结果,生成一个新的字符串。
例如把字符串中 (\w+) (\w+) 匹配到的结果替换成 Albert Einstein ,可以这样写:


>>> re.sub("(\w+) (\w+)", "Albert Einstein", "Isaac Newton, physicist")
'Albert Einstein, physicist'

re.sub 中第 1 个参数表示匹配的正则表达式,第 2 个参数表示替换表达式,第 3 个参数表示原始字符串

这里的替换表达式是手动指定的新字符串 Albert Einstein ,他和原始字符串中的内容毫不相关。如果希望复用原始字符串中的内容,那么就需要用到 re.sub 的反向引用功能了。

反向引用

反向引用指的是在指定替换结果的过程中,可以引用原始字符串中的匹配到内容。例如 (\w+) (\w+) 在原始字符串中匹配到了 Isaac Newton ,利用匹配到的结果,将结果改写为 FirstName: Isaac, LastName: Newton 。
既然需要引用,那么就得有一个表达式能够表示匹配的内容。恰好 re.sub 的匹配结果也有和 re.match 一样的分组,因此只需要在替换表达式中引用分组的结果即可。引用方式有以下几种:

  • \number :例如 \1 ,表示匹配结果中第 1 个分组,也就是例子中的 Isaac 部分。

  • \g<number> :例如 \g<1> ,和 \number 表示法一样,也代表了匹配结果中的第 1 个分组。与 \number 表示法相比, \g<number> 避免了歧义。试想,如果想用 \number 把第 1 个分组匹配到的  Isaac 替换为 Isaac0 ,那么需要用 \10 ,这里本意表示在第 1 个分组后加上 0 ,但程序会识别成第 10 个分组。而使用 \g<number> 只需要写成 \g<1>0 即可。

回到开始的例子中,将匹配结果 Isaac Newton改写为 FirstName: Isaac, LastName: Newton ,可以用以下表达式实现:


>>> re.sub("(\w+) (\w+)", "FirstName: \g<1>, LastName: \g<2>", "Isaac Newton, physicist")
'FirstName: Isaac, LastName: Newton, physicist'

参考

 re — Regular expression operations
 Python re(gex)? -- Groupings and backreferences

来源:https://juejin.cn/post/6981669149407707150

标签:Python,re.sub,反向引用
0
投稿

猜你喜欢

  • 解析SQL server与asp 互操作的时间处理

    2009-02-05 16:13:00
  • 某年第一周开始日期sql实现方法

    2012-02-25 20:02:30
  • 详解pytest实现mark标记功能详细介绍

    2022-01-16 23:59:48
  • python版DDOS攻击脚本

    2022-08-29 04:16:25
  • 图像替换新技术:状态域方法[译]

    2009-08-06 16:41:00
  • python实现时间o(1)的最小栈的实例代码

    2021-08-01 15:24:42
  • 使用Python对Excel进行读写操作

    2022-05-25 16:56:32
  • python 实现矩阵按对角线打印

    2022-08-01 02:01:07
  • vue项目中安装less依赖的过程

    2024-05-10 14:21:12
  • python3在各种服务器环境中安装配置过程

    2021-10-27 22:49:55
  • 利用git克隆历史版本(下载指定版本的代码)

    2022-06-14 11:03:17
  • vue语法之拼接字符串的示例代码

    2024-04-30 10:21:30
  • python生成IP段的方法

    2023-07-22 00:00:30
  • 微信小程序之数据缓存的实例详解

    2024-04-19 09:49:53
  • JavaScript的目的及历史

    2007-10-17 18:53:00
  • Python 中使用 argparse 解析命令行参数

    2023-10-26 14:10:42
  • PyQt5 实现字体大小自适应分辨率的方法

    2022-08-25 03:07:44
  • python飞机大战pygame游戏框架搭建操作详解

    2022-09-24 05:49:51
  • Go 加密解密算法小结

    2024-04-26 17:29:00
  • Python图像增强imgaug详解

    2022-02-07 17:07:40
  • asp之家 网络编程 m.aspxhome.com