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中关于中文编码问题的处理建议
Apr 08 Python
给Python入门者的一些编程建议
Jun 15 Python
django在接受post请求时显示403forbidden实例解析
Jan 25 Python
Python中return self的用法详解
Jul 27 Python
解决python中使用PYQT时中文乱码问题
Jun 17 Python
python 读取修改pcap包的例子
Jul 23 Python
python图像处理模块Pillow的学习详解
Oct 09 Python
Python3的unicode编码转换成中文的问题及解决方案
Dec 10 Python
Python如何读写二进制数组数据
Aug 01 Python
Python pip install之SSL异常处理操作
Sep 03 Python
Python项目实战之使用Django框架实现支付宝付款功能
Feb 23 Python
Python实现仓库管理系统
May 30 Python
Python制作一个随机抽奖小工具的实现
Python 数据科学 Matplotlib图库详解
Python3中最常用的5种线程锁实例总结
Jul 07 #Python
python实现简单的聊天小程序
python获取对象信息的实例详解
Jul 07 #Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 #Python
如何利用opencv判断两张图片是否相同详解
You might like
百度工程师讲PHP函数的实现原理及性能分析(一)
2015/05/13 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
BootStrap实用代码片段之一
2016/03/22 Javascript
jQuery中设置form表单中action值的实现方法
2016/05/25 Javascript
Chrome浏览器的alert弹窗禁止再次弹出后恢复的方法
2016/12/30 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
Vue调试神器vue-devtools安装方法
2017/12/12 Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
vue 列表页跳转详情页获取id以及详情页通过id获取数据
2019/03/27 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
[33:33]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第二场 11.27
2020/11/30 DOTA
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
2018/04/17 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
python实现快递价格查询系统
2020/03/03 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
Tahari ASL官方网站:高级设计师女装
2021/03/15 全球购物
请介绍一下WSDL的文档结构
2013/03/17 面试题
生物化学研究助理员求职信
2013/10/09 职场文书
幼师自我鉴定
2014/02/01 职场文书
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
民主评议党员工作总结
2014/10/20 职场文书
关于开学的感想
2015/08/10 职场文书
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android