You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式仅替换数字两侧的下划线为短横线?

嘿,我明白你遇到的问题了——想把数字两侧的下划线换成短横线,结果不小心把中间的数字弄丢了,这确实是正则新手容易踩的小坑,咱们一步步来解决它。

问题出在哪?

你写的正则r"()[_](\d*)[_]()"里,虽然把数字放进了第二个分组,但空分组完全是冗余的,而且\d*是匹配0个或多个数字,如果遇到没有数字的__也会匹配,更关键的是这种绕圈的写法容易导致匹配偏差,反而没达到预期效果。

正确的解法

我们只需要精准匹配「下划线+数字+下划线」的模式,把数字捕获下来,替换时保留数字,只把前后的下划线换成短横线就好。

基础版(适用于所有数字两侧的下划线替换)

用这个正则和替换式就能直接得到你想要的结果:

import re

original = "first_part_1234_this_is_the_second_part"
desired = re.sub(r"_(\d+)_", r"-\1-", original)
print(desired)

输出结果:first_part-1234-this_is_the_second_part

解释:

  • _(\d+)_:匹配_开头,接着是至少一个数字(\d+比\d*更精准,避免匹配空数字的__),然后是_;同时把中间的数字捕获到分组\1里。
  • r"-\1-":替换时,把前后的_换成-,同时保留分组里的数字(\1就是我们捕获到的数字)。

进阶版(仅替换两段文本之间的数字下划线)

如果你的需求更严格,只想替换被文本包围的数字两侧下划线(比如不想替换字符串开头的_1234_或结尾的_1234_),可以用正向/反向预查来限制匹配范围:

desired = re.sub(r"(?<=[^_])_(\d+)_(?=[^_])", r"-\1-", original)
  • (?<=[^_]):反向预查,确保数字前面的_之前是非下划线的字符(也就是有文本在前面)。
  • (?=[^_]):正向预查,确保数字后面的_之后是非下划线的字符(也就是有文本在后面)。

这样就只会替换真正夹在两段文本之间的数字下划线啦。

内容的提问来源于stack exchange,提问作者ceharep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 20:12:29