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

Python如何使用正则表达式替换字母单词间空格为下划线

代码失效原因

你写的代码跑不通是几个低级错误叠出来的:

  • 正则表达式直接抄了Vim编辑器的替换命令格式:%s/.../g,Python的re模块根本不认这种语法,\a这类Vim专属的正则简写在Python里也不生效
  • 变量名前后不统一:你定义的正则对象叫regex,调用re.sub的时候传的是不存在的变量p,要处理的字符串写的是line,和你提前赋值的sample_line完全是两个变量
  • 替换规则写错了:你写的替换内容是\1\2,就算正则匹配成功,也只会把两个字母中间的空格直接删掉,不会加下划线,而且单次匹配没法覆盖三个及以上单词组成的对象名。
正确实现方法

核心匹配逻辑很简单:只替换左右两侧都是英文字母的空格——这类空格属于多单词对象名的内部间隔,要换成下划线;只要空格任意一侧是数字,就保留作为元素分隔符。
用零宽断言写正则就可以实现,不会吞掉空格两边的字母,还能自动匹配所有符合要求的空格,不需要循环替换:

import re

sample_line = "office supplies 674.56 570.980487 755.84 682.360029"
# 匹配所有左右都是英文字母的空格,替换为下划线
processed = re.sub(r'(?<=[a-zA-Z])\s(?=[a-zA-Z])', '_', sample_line)
print(processed)
# 后续要转成列表直接按空格拆分即可
result = processed.split()

运行后输出的字符串就是你期望的:
office_supplies 674.56 570.980487 755.84 682.360029
拆分后的列表为:
['office_supplies', '674.56', '570.980487', '755.84', '682.360029']

如果遇到更长的多单词对象名,比如输入printer paper tray 129.99 45.2,这段代码也能正常处理成printer_paper_tray 129.99 45.2,不需要额外调整规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:48:22