替换除数字之间的逗号
我需要替换除数字之间的逗号之外的所有逗号(忽略空格)。一些例子是:
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
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
逻辑:
- 如果数字前后不替换
- 替换之前的数字
- 如果数字之后替换
- 如果没有周围的数字,则替换
我尝试过消极前瞻和消极后视:
但这在以下情况下失败:
foo,5 => foo,5
foo ,5 => foo ,5
我觉得我很接近,在此先感谢您的帮助。
回答
您可以使用
re.sub(r'(ds*,)(?=s*d)|,', r'1', text)
请参阅正则表达式演示。细节:
(ds*,)(?=s*d)- 一个数字、零个或多个空格和一个捕获到组 11中的逗号(在替换模式中指的是这个值),后面跟着零个或多个空格和一个数字|- 或者,- 任何其他上下文中的逗号。
请参阅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'(ds*,)(?=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
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)匹配一个或多个数字,然后匹配一个或多个用零个或多个空格包围的逗号,然后是一个或多个数字,整个字符序列被丢弃,下一次搜索在失败位置开始,这要归功于(*SKIP)(*F)动词。
请参阅此 Python 演示:
d+(?:s*,s*d+)+(*SKIP)(*F)|,