第11.23节 Python 中re模块的搜索替换功能:sub及subn函数
一、 引言
在《第11.3节 Python正则表达式搜索支持函数search、match、fullmatch、findall、finditer》重点介绍了几个搜索函数,除了搜索,re模块也提供搜索并替换功能,这个就是re模块的sub函数。
二、 语法释义
调用语法:
re.sub(pattern, repl, string, count=0, flags=0)
re.subn(pattern, repl, string, count=0, flags=0)参数:
1)pattern:匹配的正则表达式;
2)string:搜索文本字符串
3)repl:替换对象,将搜索文本中和模式匹配的字符串替换为repl对象对应的内容,repl可以是,或者是字符串一个函数
4)count:用于限制最多替换多少次,为0或者没有传入则全部替换;
5)flags:搜索标记,与《第11.2节 Python 正则表达式支持函数概览》介绍的参数flags标记含义相同。返回值:
sub返回通过使用 repl 替换在通过正则表达式模式搜索到的字符串。 如果没有找到匹配子串,则直接返回 string。
subn与sub函数一样执行搜索替换,但是不是返回替换后的字符串,而是返回一个元组,元组的第一个元素是替换后的字符串(该元素与sub返回值相同),第二个元素是执行替换的次数。
三、 关于repl参数的说明
- 可以是字符串,如为字符串,则其中任何反斜杠转义序列都会被按转义结果处理, 也就是说,\n 会被转换为一个换行符,\r 会被转换为一个回车附,…。 未知的 ASCII 字符转义序列会被当作错误来处理,其他未知转义序列例如
\&
会保持原样; - repl如果是字符串,可以使用组名如\g或组序号如 \1、\g<序号>的后向引用,实际处理时会使用组匹配结果的对应组所匹配到的子字符串来执行目标串的替换;
- 如果repl是函数类型:
1)函数只能带一个参数,参数类型必须是匹配对象;
2)该匹配对象是Python每匹配到一个搜索串时调用,由于搜索内容是由整个正则表达式确认的,因此一般情况下搜索串应该是以代表整个搜索内容的组0对应结果作为处理数据进行处理,除非有特殊处理要求再考虑使用其他组;
3)Python在每匹配到一个该函数对匹配对象处理的结果进行处理后的返回内容作为替换字符串。
四、 案例
- 分别调用sub和subn使用字符串作为替换内容,字符串包含组名和组序号
>>> re.sub(r'(?i)(?P<lab>py\w*)',r'\1:\g<1>:\g<lab>->Python','Python?PYTHON!Learning python with LaoYuan! ')
'Python:Python:Python->Python?PYTHON:PYTHON:PYTHON->Python!Learning python:python:python->Python with LaoYuan! '
>>>re.subn(r'(?i)(?P<lab>py\w*)',r'\1:\g<1>:\g<lab>->Python','Python?PYTHON!Learning python with LaoYuan! ')
('Python:Python:Python->Python?PYTHON:PYTHON:PYTHON->Python!Learning python:python:python->Python with LaoYuan! ', 3)
>>>
上述案例中,\1:\g<1>:\g<lab>
都是访问的匹配的字符串,除了不论大小写的“python”,其他诸如“py”、“pyth”等py开头的字符串都会被替换为“Python”。
- 使用函数作为替换内容
本案例将小说的中文章节中的数字替换为阿拉伯数字,定义了函数transnumber将中文数字翻译成阿拉伯数字,在正则表达式中找章节并调用函数transnumber执行替换。
>>> def transnumber(m):
numbdict={'零':'0','一':'1','二':'2','三':'3','四':'4','五':'5','六':'6','七':'7','八':'8','九':'9','十':'','百':''}
result=[]
for i in m.group(0):result.append(numbdict[i])
resultstr = ''.join(result)
print("group(0):",m.group(0),"groups:",m.groups(),"result:",resultstr)
return resultstr
>>> re.sub(r'(?<=第)([一-十零百]+)(?=[章,回])',transnumber,'第一回第二回第九十七回第一百零八回第七百二十二回')
group(0): 一 groups: ('一',) result: 1
group(0): 二 groups: ('二',) result: 2
group(0): 九十七 groups: ('九十七',) result: 97
group(0): 一百零八 groups: ('一百零八',) result: 108
group(0): 七百二十二 groups: ('七百二十二',) result: 722
'第1回第2回第97回第108回第722回'
>>> re.subn(r'(?<=第)([一-十零百]+)(?=[章,回])',transnumber,'第一回第二回第九十七回第一百零八回第七百二十二回')
group(0): 一 groups: ('一',) result: 1
group(0): 二 groups: ('二',) result: 2
group(0): 九十七 groups: ('九十七',) result: 97
group(0): 一百零八 groups: ('一百零八',) result: 108
group(0): 七百二十二 groups: ('七百二十二',) result: 722
('第1回第2回第97回第108回第722回', 5)
>>>
老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython
请大家多多支持,点赞、评论和加关注!谢谢!
第11.23节 Python 中re模块的搜索替换功能:sub及subn函数的更多相关文章
- 第11.22节 Python 中re模块的字符串分割器:split函数
一. 引言 在<第11.2节 Python 正则表达式支持函数概览>介绍了re模块的主要函数,在<第11.3节 Python正则表达式搜索支持函数search.match.fullm ...
- 第11.18节 Python 中re模块的匹配对象
匹配对象是Python中re模块正则表达式匹配处理的返回结果,用于存放匹配的情况.老猿认为匹配对象更多的应该是与组匹配模式的功能对应的,只是没有使用组匹配模式的正则表达式整体作为组0. 为了说明下面的 ...
- 第11.24节 Python 中re模块的其他函数
一. re.compile函数 正则表达式编译函数,在后面章节专门介绍. 二. re.escape(pattern) re.escape是一个工具函数,用于对字符串pattern中所有可能被视为正则表 ...
- 第11.20节 Python 中正则表达式的扩展功能:后视断言、后视取反
一. 引言 在<第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反>中老猿介绍了前视断言和前视取反,与二者对应的还有后视断言和后视取反. 二. (?<=-)后视 ...
- 第11.21节 Python 中正则表达式的其他扩展功能
一. 引言 在<第11.17节 Python 正则表达式扩展功能:命名组功能及组的反向引用>中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是正则表达式的扩展功能,其实在re模块中 ...
- 第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反
一. 引言 在<第11.16节 Python正则元字符"()"(小括号)与组(group)匹配模式>中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是组模式的扩 ...
- 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析
一. 引言 <第8.21节 Python中__lt__.gt__等 "富比较"("rich comparison")方法用途探究>和<第8.2 ...
- 第9.11节 Python中IO模块文件打开读写操作实例
为了对前面学习的内容进行一个系统化的应用,老猿写了一个程序来进行文件相关操作功能的测试. 一. 测试程序说明 该程序允许测试人员选择一个文件,自己输入文件打开模式.写入文件的位置以及写入内容,程序按照 ...
- 第9.10节 Python中IO模块其他文件操作属性和方法简介
本文中所有案例中的fp都是使用open函数打开文件返回的一个文件对象,为了节省篇幅,大部分没有提供文件打开的代码. 一. 文件是否关闭的属性 属性名:closed 功用:判断文件是否关闭 示例: &g ...
随机推荐
- leetcode147median-of-two-sorted-arrays
题目描述 有两个大小分别为m和n的有序数组A和B.请找出这两个数组的中位数.你需要给出时间复杂度在O(log (m+n))以内的算法. There are two sorted arrays A an ...
- 时间序列数据的定义,读取与指数平滑(Java)
应上头的要求,需要实现以下指数平滑进行资源调度负载的预测,那就是用我最喜欢的Java做一下吧. 引用<计量经济学导论>的一句话:时间序列数据区别于横截面数据的一个明显特点是,时间序列数据集 ...
- 内网渗透 day9-免杀基础
免杀1 目录 1. 会话提升的几种方式 1 2. armitage的熟悉 2 3. handler生成监听器的方法 6 4. 防止会话假死 6 5. 控制台设置编码 7 6. upx加壳 7 7. m ...
- binary hacks读数笔记(od命令)
Linux od命令用于输出文件内容. od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来 -t<输出格式>或--format=<输出格式> 设置输出格式. 实例 ...
- API简介(二)
API简介(二) API简介(一)一文中,介绍了使用API的目的.设计.发行政策以及公共API的含义,本篇主要介绍API的用法,从库和框架.操作系统.远程API.Web API四个方面展开. 库和框架 ...
- [代码审计]:PhpMyWind储存型XSS漏洞(CVE-2017-12984)
简介 今天开启一下代码审计的篇章 python安全编程剩下的看起来没意思就结束了 ,现在规划每2周写一个爬虫练练手, 然后今天开启代码审计和Docker的学习 我个人感觉先看漏洞利用过程再看漏洞分析 ...
- 为什么TCP连接时是三次握手,而不是两次或四次?
TCP连接时有一个重要的任务就是服务端和客户端双方互相确认收发功能是否正常.图中步骤1,当客户端发起连接,服务端接收到请求,对于服务端来说,它此时知道客户端的发送功能和自己的接收功能是正常的. 图中步 ...
- 正则表达式——maltrail工程项目中使用
1. 正则表达所需语法 \ 正则表达式使用反斜杠字符 ('') 来表示特殊形式或是允许在使用特殊字符时不引发它们的特殊含义. 转义特殊字符(允许你匹配 '*', '?', 或者此类其他) \A 只匹配 ...
- PC 端轮播图的实现
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- testlink——解决测试度量与报告或图表中中文显示乱码问题
解决问题之前的图表: 解决方法: (1)下载SimHei.TTF字体(可以在自己电脑的C:/windows/fonts目录下找到,若找不到,可以在网上下载) (2)将SimHei.TTF文件拷贝到te ...