Python中如何基于匹配序号替换指定正则模式的所有匹配实例?
Python中按匹配序号替换指定正则模式的所有匹配项
要实现将文本中所有符合(AB)(.*?)(CD)模式的匹配项,按匹配顺序添加对应数量的n和序号后缀(第1个匹配加n1,第2个加nn2,第3个加nnn3),可以借助Python的re模块,通过回调函数跟踪匹配次数来完成。
实现方法1:使用全局计数器
import re # 原始文本 raw_text = "bla bla blab ABftrCD bla bla ABgtCD bla blab ABnyhCD" # 初始化匹配计数器 match_count = 0 def add_suffix(match_obj): global match_count match_count += 1 # 生成对应后缀:第N次匹配就加N个'n' + 数字N suffix = 'n' * match_count + str(match_count) # 返回原匹配内容 + 后缀 return match_obj.group(0) + suffix # 执行替换 processed_text = re.sub(r'(AB)(.*?)(CD)', add_suffix, raw_text) print(processed_text)
实现方法2:使用闭包(更优雅,避免全局变量)
如果不想用全局变量,可通过闭包维护计数器,减少副作用:
import re raw_text = "bla bla blab ABftrCD bla bla ABgtCD bla blab ABnyhCD" def create_replacer(): count = 0 def replacer(match_obj): nonlocal count count += 1 suffix = 'n' * count + str(count) return match_obj.group(0) + suffix return replacer processed_text = re.sub(r'(AB)(.*?)(CD)', create_replacer(), raw_text) print(processed_text)
运行结果
两种方法都会输出:
bla bla blab ABftrCDn1 bla bla ABgtCDnn2 bla blab ABnyhCDnnn3
关键说明
re.sub的第三个参数传入回调函数时,每次匹配到符合正则模式的内容,就会调用该函数,函数接收匹配对象match_obj作为参数match_obj.group(0)获取整个匹配的字符串(比如ABftrCD)- 通过计数器跟踪匹配顺序,动态生成对应数量的
n和序号后缀
内容的提问来源于stack exchange,提问作者moshtaba
相关产品推荐
相关产品推荐

