首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

第11.23节 Python 中re模块的搜索替换功能:sub及subn函数

  • 23-09-22 18:30
  • 4208
  • 5230
blog.csdn.net

一、 引言
在《第11.3节 Python正则表达式搜索支持函数search、match、fullmatch、findall、finditer》重点介绍了几个搜索函数,除了搜索,re模块也提供搜索并替换功能,这个就是re模块的sub函数。

二、 语法释义

  1. 调用语法:
    re.sub(pattern, repl, string, count=0, flags=0)
    re.subn(pattern, repl, string, count=0, flags=0)

  2. 参数:
    1)pattern:匹配的正则表达式;
    2)string:搜索文本字符串
    3)repl:替换对象,将搜索文本中和模式匹配的字符串替换为repl对象对应的内容,repl可以是,或者是字符串一个函数
    4)count:用于限制最多替换多少次,为0或者没有传入则全部替换;
    5)flags:搜索标记,与《第11.2节 Python 正则表达式支持函数概览》介绍的参数flags标记含义相同。

  3. 返回值:
    sub返回通过使用 repl 替换在通过正则表达式模式搜索到的字符串。 如果没有找到匹配子串,则直接返回 string。
    subn与sub函数一样执行搜索替换,但是不是返回替换后的字符串,而是返回一个元组,元组的第一个元素是替换后的字符串(该元素与sub返回值相同),第二个元素是执行替换的次数。

三、 关于repl参数的说明

  1. 可以是字符串,如为字符串,则其中任何反斜杠转义序列都会被按转义结果处理, 也就是说, 会被转换为一个换行符, 会被转换为一个回车附,…。 未知的 ASCII 字符转义序列会被当作错误来处理,其他未知转义序列例如 &会保持原样;
  2. repl如果是字符串,可以使用组名如g或组序号如 1、g<序号>的后向引用,实际处理时会使用组匹配结果的对应组所匹配到的子字符串来执行目标串的替换;
  3. 如果repl是函数类型:
    1)函数只能带一个参数,参数类型必须是匹配对象;
    2)该匹配对象是Python每匹配到一个搜索串时调用,由于搜索内容是由整个正则表达式确认的,因此一般情况下搜索串应该是以代表整个搜索内容的组0对应结果作为处理数据进行处理,除非有特殊处理要求再考虑使用其他组;
    3)Python在每匹配到一个该函数对匹配对象处理的结果进行处理后的返回内容作为替换字符串。

四、 案例

  1. 分别调用sub和subn使用字符串作为替换内容,字符串包含组名和组序号
>>> re.sub(r'(?i)(?Ppyw*)',r'1:g<1>:g->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)(?Ppyw*)',r'1:g<1>:g->Python','Python?PYTHON!Learning python with LaoYuan! ')
('Python:Python:Python->Python?PYTHON:PYTHON:PYTHON->Python!Learning python:python:python->Python with LaoYuan! ', 3)
>>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

上述案例中,1:g<1>:g都是访问的匹配的字符串,除了不论大小写的“python”,其他诸如“py”、“pyth”等py开头的字符串都会被替换为“Python”。

  1. 使用函数作为替换内容
    本案例将小说的中文章节中的数字替换为阿拉伯数字,定义了函数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)
>>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

老猿Python,跟老猿学Python!
博客地址:http://iyenn.com/index/link?url=https://blog.csdn.net/LaoYuanPython

请大家多多支持,点赞、评论和加关注!谢谢!

文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树基础语法函数333596 人正在系统学习中
老猿Python
微信公众号
专注Python相关语言、图像音视频处理、AI
注:本文转载自blog.csdn.net的LaoYuanPython的文章"https://blog.csdn.net/LaoYuanPython/article/details/100045422"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top