Python re.sub 反向引用的实现


Posted in Python onJuly 07, 2021
目录
  • 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

到此这篇关于Python re.sub 反向引用的实现的文章就介绍到这了,更多相关Python re.sub 反向引用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Python 相关文章推荐
python调用cmd命令行制作刷博器
Jan 13 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
使用pandas读取csv文件的指定列方法
Apr 21 Python
解决pandas read_csv 读取中文列标题文件报错的问题
Jun 15 Python
Python2与Python3的区别实例分析
Apr 11 Python
Django框架orM与自定义SQL语句混合事务控制操作
Jun 27 Python
python3获取当前目录的实现方法
Jul 29 Python
关于Python内存分配时的小秘密分享
Sep 05 Python
代码总结Python2 和 Python3 字符串的区别
Jan 28 Python
Django User 模块之 AbstractUser 扩展详解
Mar 11 Python
python pillow库的基础使用教程
Jan 13 Python
python实现网络五子棋
Apr 11 Python
Python制作一个随机抽奖小工具的实现
Python 数据科学 Matplotlib图库详解
Python3中最常用的5种线程锁实例总结
Jul 07 #Python
python实现简单的聊天小程序
python获取对象信息的实例详解
Jul 07 #Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 #Python
如何利用opencv判断两张图片是否相同详解
You might like
PHP+APACHE实现用户论证的方法
2006/10/09 PHP
基于PHP开发中的安全防范知识详解
2013/06/06 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
php+resumablejs实现的分块上传 断点续传功能示例
2017/04/18 PHP
十个迅速提升JQuery性能让你的JQuery跑得更快
2012/12/10 Javascript
jquery实现div阴影效果示例代码
2013/09/16 Javascript
对js关键字命名的疑问介绍
2014/04/25 Javascript
Javascript中浮点数相乘的一个解决方法
2014/06/03 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
微信小程序 Toast自定义实例详解
2017/01/20 Javascript
微信小程序 数据交互与渲染实例详解
2017/01/21 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
AngularJS 购物车全选/取消全选功能的实现方法
2017/08/14 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
在python中只选取列表中某一纵列的方法
2018/11/28 Python
python实现对输入的密文加密
2019/03/20 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
2019/08/26 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
Django中F函数的使用示例代码详解
2020/07/06 Python
CSS3 透明色 RGBA使用介绍
2013/08/06 HTML / CSS
Myprotein俄罗斯官网:欧洲第一运动营养品牌
2019/05/05 全球购物
公司综合部的成员自我评价分享
2013/11/05 职场文书
测绘工程个人的自我评价
2013/11/10 职场文书
设计部经理的岗位职责
2013/11/16 职场文书
大学生求职自荐信
2013/12/12 职场文书
2014年十八届四中全会思想汇报范文
2014/10/17 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书
Python自动化爬取天眼查数据的实现
2021/06/15 Python
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python