【问题标题】:replace a comma only if is between two numbers [duplicate]仅当在两个数字之间时才替换逗号[重复]
【发布时间】:2017-09-05 11:46:45
【问题描述】:

我正在尝试将逗号替换为以下情况:

123,123  

输出应该在哪里:

123123

为此我尝试了这个:

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

但这也是删除数字,如何避免这种情况?

我只想特别为这种情况修改逗号,这就是我使用正则表达式的方式。对于这种情况,例如

'123,123  hello,word'

想要的输出是:

'123123  hello,word'

【问题讨论】:

标签: python regex


【解决方案1】:

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

import re

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

【讨论】:

    【解决方案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)字符分隔单词)。

    【讨论】:

    猜你喜欢
    • 2022-11-27
    • 2017-12-28
    • 2023-03-09
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    相关资源
    最近更新 更多