我试图用以下情况替换逗号:
123,123
输出应为:
123123
为此我尝试了这个:
re.sub('\d,\d','','123,123')
但这也是删除数字,怎么能避免这个?
我只想重新编写该案例的逗号,这就是我使用正则表达式的方式。对于这种情况,例如
'123,123 hello,word'
所需的输出是:
'123123 hello,word'
答案 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 )字符。