仅在两个数字之间替换逗号

时间:2017-09-05 03:08:26

标签: python regex

我试图用以下情况替换逗号:

123,123  

输出应为:

123123

为此我尝试了这个:

re.sub('\d,\d','','123,123')

但这也是删除数字,怎么能避免这个?

我只想重新编写该案例的逗号,这就是我使用正则表达式的方式。对于这种情况,例如

'123,123  hello,word'

所需的输出是:

'123123  hello,word'

2 个答案:

答案 0 :(得分:6)

您可以使用正则表达式查看来限制逗号(?<=\d),(?=\d);使用?<= 向后看?=用于向前看;它们是零长度断言,不会消耗字符,因此不会删除环视中的图案:

import re

re.sub('(?<=\d),(?=\d)', '', '123,123  hello,word')
# '123123  hello,word'

答案 1 :(得分:2)

这是您希望正则表达式“lookaround assertions”...具有零长度(模式捕获语义)的情况之一。

这样做可以让您匹配在替换中“重叠”的情况。

以下是一个例子:

#!python
import re
num = '123,456,7,8.012,345,6,7,8'
pattern = re.compile(r'(?<=\d),(?=\d)')
pattern.sub('',num)
# >>> '12345678.012345678'

...请注意,我正在使用 re.compile()来使其更具可读性,并且因为在许多情况下该使用模式可能会表现得更好。我正在使用与@Psidom相同的正则表达式;但是我使用Python'原始'字符串,这通常是在Python中表达正则表达式的方式。

我故意使用一个例子,如果我使用的是正则表达式,则逗号的间距会重叠; re.compile(r'(\ d),(\ d)')并尝试使用对已捕获字符的反向引用替换 pattern.sub(r'\ 1 \ 2', num) ...这可以用于许多例子;但是'1,2,3'不匹配,因为捕获导致它们重叠。

存在这些“环视”(前瞻和后瞻)断言的主要原因之一是......避免由于捕获和重叠语义而必须重复/递归应用模式的情况。这些断言不捕获,它们匹配“零”字符(如某些PCRE元模式,如 \ b ...匹配单词之间的零长度边界而不是任何空格( \ s 分隔单词的非“字”( \ W )字符。