python - 替换逗号,数字之间除外
问题描述
我需要替换所有逗号,除了数字之间的逗号(忽略空格)。一些例子是:
foo, bar 12,6 => foo bar 12,6
foo, bar 12, 6 => foo bar 12, 6
foo, bar 12 ,6 => foo bar 12 ,6
foo, bar 12, => foo bar 12
foo, bar ,6 => foo bar 6
foo,5 => foo5
foo ,5 => foo 5
逻辑:
- 不要替换前后的 if 数字
- 替换之前的数字
- 如果数字后替换
- 如果周围没有数字,则替换
我尝试过负前瞻和负后瞻:
# regex:
# (?<!\d)(\s?)(,)(\s?)(?!\d)
import re
def replace_comma_by_space(value):
return re.sub(r'(?<!\d)(\s?)(,)(\s?)(?!\d)', r'\1\3', value)
但这在以下情况下失败:
foo,5 => foo,5
foo ,5 => foo ,5
我觉得我很亲密,在此先感谢您的帮助。
解决方案
您可以使用
re.sub(r'(\d\s*,)(?=\s*\d)|,', r'\1', text)
请参阅正则表达式演示。细节:
(\d\s*,)(?=\s*\d)
- 一个数字、零个或多个空格和一个逗号被捕获到第 1 组(\1
在替换模式中指的是这个值),后面跟着零个或多个空格和一个数字|
- 或者,
- 任何其他上下文中的逗号。
请参阅Python 演示:
import re
strings = ['foo, bar 12,6','foo, bar 12, 6','foo, bar 12 ,6','foo, bar 12,','foo, bar ,6','foo,5','foo ,5']
for s in strings:
print(s, '=>', re.sub(r'(\d\s*,)(?=\s*\d)|,', r'\1', s))
输出:
foo, bar 12,6 => foo bar 12,6
foo, bar 12, 6 => foo bar 12, 6
foo, bar 12 ,6 => foo bar 12 ,6
foo, bar 12, => foo bar 12
foo, bar ,6 => foo bar 6
foo,5 => foo5
foo ,5 => foo 5
使用 PyPi 正则表达式模块,您可以使用
\d+(?:\s*,\s*\d+)+(*SKIP)(*F)|,
请参阅正则表达式演示。在这里,\d+(?:\s*,\s*\d+)+(*SKIP)(*F)
匹配一个或多个数字,然后匹配一个或多个逗号,其中包含零个或多个空格,然后是一个或多个数字,并且整个字符序列被丢弃,并且由于(*SKIP)(*F)
动词而在失败位置开始下一次搜索。
请参阅此 Python 演示:
import regex
rx = regex.compile(r'\d+(?:\s*,\s*\d+)+(*SKIP)(*F)|,')
import re
strings = ['foo, bar 12,6','foo, bar 12, 6','foo, bar 12 ,6','foo, bar 12,','foo, bar ,6','foo,5','foo ,5']
for s in strings:
print(s, '=>', rx.sub('', s))
推荐阅读
- c# - 为什么我不能让 Automapper 参数化工作
- richfaces - 更改rich的背景颜色:选择richfaces中的项目
- json - 无法读取从 json 文件导入的图像 url
- typescript - VSCode 中的可选链接运算符支持
- reactjs - React,函数不加载数据
- wpf - 组合框用户手动输入和选择更改
- xml - xslt:从生成的表中替换节点值
- azure - azure runbook 使用 powershell 工作流在表格中发送电子邮件
- node.js - 将变量从 app.get 传递到 pug 视图
- swift - Swift4 - 带有文本字段的多个警报 - 完成处理程序