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
相关产品推荐
相关产品推荐

