Python正则表达式:保留指定组及模式前后缀的替换方法
解决方案
要实现你的预期输出zxc wololo !zxc,只需要在repl参数里明确写出要保留的前缀、第一组内容、感叹号和后缀即可。具体代码如下:
import re p = 'zxc(.*?)!(.*?)zxc' s = 'zxc wololo ! ololo zxc' result = re.sub(pattern=p, repl=r"zxc\1!zxc", string=s) print(result) # 输出: zxc wololo !zxc
原理说明
你的正则表达式zxc(.*?)!(.*?)zxc会匹配整个目标字符串,其中:
zxc是需要保留的前后缀匹配项\1对应第一捕获组(.*?),也就是' wololo '(zxc到!之间的内容)!是你想要保留的固定分隔字符- 第二捕获组
(.*?)对应的' ololo '是需要剔除的内容
通过在替换字符串里显式组合要保留的固定部分和捕获组引用,就能精准保留所需内容,同时丢弃不需要的捕获组内容。
多捕获组的通用处理方式
如果存在多个捕获组,你只需要在repl里按照需求组合固定保留的字符和**对应捕获组的引用(\1、\2、\3...)**即可。比如有3个捕获组时,若想保留前缀、\1、固定分隔符、\3、后缀,替换字符串就可以写成r"前缀\1固定内容\3后缀"。
举个实际例子:
p = 'abc(.*?)def(.*?)ghi(.*?)jkl' s = 'abc hello def foo ghi bar jkl' # 保留abc、hello、def、bar、jkl,丢弃中间的foo result = re.sub(p, r"abc\1def\3jkl", s) print(result) # 输出: abc hello def bar jkl
内容的提问来源于stack exchange,提问作者Yuriy Leonov




