首页 > 解决方案 > 替换逗号,数字之间除外

问题描述

我需要替换所有逗号,除了数字之间的逗号(忽略空格)。一些例子是:

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

逻辑:

我尝试过负前瞻和负后瞻:

# 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

我觉得我很亲密,在此先感谢您的帮助。

标签: pythonregex

解决方案


您可以使用

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))

推荐阅读