关于 re.sub 部分替换的解决办法
- 写作背景
- 问题重现
- 解决办法
- 代码详解
- 结尾
写作背景
最近本菜鸡遇到一个问题,我想将字符串中某一部分替换成指定内容,而且为了定位到要替换的内容,所以使用正则的时候还需要前后一些字符作为锚点,这可让我犯了难。
不过查阅相关文章后,我确定了如何解决,并写下此篇文章以记录。
如果觉得我这篇文章写的好的话,能不能给我 点赞 、评论 、收藏 一条龙(☆▽☆)。如果要点个 关注 的话也不是不可以🤗。
请各位参加一下文末的 投票 哦,如果 有什么不足之处,还 请各位大佬在评论区提出,不胜感激。
问题重现
拿一个网址 https://www.xxx.com/?count=5&begin=1&userid=111 为例。
全部替换大家应该都会,比如说我想要将 begin=1 替换为 start=12 ,就可以使用下述代码解决。
可以看到,啪的一下他就运行出来了,很快噢。
那么问题来了,如果说我想要将参数 begin 的值修改为 12 应该怎么办呢?
我最初单纯地以为简简单单地加上 括号 的使用如下所示即可达成目标,却不曾想结果不尽人意,如下图所示。

可以看到,它直接把 begin=1 这个整体替换成了 12 ,这可不是我们预期的效果。
解决办法
既然自己搞不定,那肯定要寻求外部帮助。于是在我千辛万苦的探索后,我找到了 这篇问答 。

因为都是英文,我也懒得仔细看,不过根据这段代码我看出了些端倪。
可以看到,替换的字符串中 \1 的位置变成了 不想被替换的部分 ,所以我可以大胆猜测 \1 的作用就是 代替部分替换中不想要被替换的部分,那这么一来,我们使用 括号 将不想被替换的部分括住,在替换字符串中用 \1 代替这一部分,问题也就迎刃而解了。
(我以前还真不知道有这操作,我好菜啊,别骂つ﹏⊂)
代码详解
基于那篇问答的解决方案,针对上边提出的问题,我的解决思路如下。
re.sub('(begin=)\d+', r'\1' + '12', url)
看一下结果。

好像还是不太对劲,被替换的部分直接变成了 J ,什么原因呢?
应该是 \1 和 12 结合起来变成了 \112 ,就是 ASCII 码中的第 112 位字符,即 J ,所以这两部分不可直接相加,那怎么办?
我的解决方案是 只括住 begin 作为不改变的部分而将 = 作为被替换字符的一部分 ,结果如下图所示。

成功完成目标!!!
如果有什么其他的解决办法也可在评论区进行讨论。
备注:可能会有人问为什么不直接把 12 和 \1 写到一个引号中,是因为实际使用过程中使用的是 变量 ,而不是这个确定的值,所以就分开写咯。
结尾
有想要一起学习 python 的小伙伴可以 私信我 进群哦。
以上就是我要分享的内容,因为 学识尚浅,会有不足,还 请各位大佬指正。
有什么问题也可在评论区留言。




















