如何使用regex sub修改匹配部分实现子串替换及内容插入?
使用正则表达式sub实现匹配子串的修改与插入操作
一、在匹配内容末尾添加内容(你的示例场景)
针对你给出的需求:将字符串中所有符合r'[A-Z][a-z]+'的单词末尾加上1,可以通过re.sub的两种方式实现:
方法1:使用lambda匿名函数处理匹配项
直接对每个匹配结果进行字符串拼接:
import re original_str = "The most comment log in coding is Hello World" pattern = r'[A-Z][a-z]+' result = re.sub(pattern, lambda m: m.group() + '1', original_str) print(result) # 输出:The1 most comment log in coding is Hello1 World1
这里lambda m中的m是匹配对象,m.group()获取当前匹配到的完整子串,后续拼接'1'即可完成替换。
方法2:使用分组引用(适合简单场景)
用\g<0>直接引用整个匹配内容,语法更简洁:
result = re.sub(pattern, r'\g<0>1', original_str) # 输出结果与方法1一致
二、在匹配内容中间插入内容
如果需要在匹配子串的中间位置插入内容,核心思路是通过正则分组拆分匹配内容,再重组插入新内容,或者用自定义函数实现动态逻辑。
场景1:固定位置插入
比如要在每个匹配单词的第二个字符后插入1,先通过正则分组拆分单词:
# 正则分组:第一组是首字母+第二个字符,第二组是剩余字符 pattern_mid = r'([A-Z][a-z])([a-z]+)' result_mid = re.sub(pattern_mid, r'\11\2', original_str) print(result_mid) # 输出:T1he most comment log in coding is He1llo W1orld
这里\1引用第一组匹配的内容,\2引用第二组,中间插入1后重组即可。
场景2:动态位置插入(根据匹配内容长度)
如果需要根据单词长度动态选择插入位置(比如在单词中间位置插入),可以自定义处理函数:
def insert_dynamic(match): word = match.group() # 取长度的一半作为插入位置 insert_pos = len(word) // 2 return word[:insert_pos] + '1' + word[insert_pos:] result_dynamic = re.sub(pattern, insert_dynamic, original_str) print(result_dynamic) # 输出:Th1e most comment log in coding is Hel1lo Wo1rld
核心总结
re.sub的两种核心用法:
- 字符串替换:适合固定规则的修改,用
\g<n>引用分组内容(n为分组序号,\g<0>代表整个匹配) - 函数替换:适合动态逻辑的修改,函数接收匹配对象为参数,返回处理后的字符串
内容的提问来源于stack exchange,提问作者Ammar Ibraheem
相关产品推荐
相关产品推荐

