【问题标题】:Python replace middle digits with commas thousand separatorPython用逗号千位分隔符替换中间数字
【发布时间】:2014-09-10 20:18:39
【问题描述】:

我有一个这样的字符串:

123456789.123456789-123456789

在小数点/连字符之前和之后可以有任意数量的数字,我需要做的是删除小数点之前的所有内容,包括小数点,并删除连字符和连字符之后的所有内容。然后使用中间的一组数字(我需要保留),我需要放置一个逗号千位分隔符。

所以这里的输出是:

123,456,789

我可以使用环视来捕获中间的数字,但它不会替换其他数字,而且我不确定如何使用环视来放置逗号。

(?<=\.)\d+(?=-)

然后我想我可以使用这样的捕获组,它会起作用,但不确定如何插入逗号

\d+\.(\d+)-\d+

如何使用上述正则表达式之一插入逗号?

【问题讨论】:

    标签: python regex regex-lookarounds


    【解决方案1】:

    不要尝试使用正则表达式插入千位分隔符;只需选择中间的数字并使用函数来产生替换; re.sub() 接受一个函数作为替换模式:

    re.sub(r'\d+\.(\d+)-\d+', lambda m: format(int(m.group(1)), ','), inputtext)
    

    format() function 中使用整数的, 格式处理将数字格式化为带有千位分隔符的一:

    >>> import re
    >>> inputtext = '123456789.123456789-123456789'
    >>> re.sub(r'\d+\.(\d+)-\d+', lambda m: format(int(m.group(1)), ','), inputtext)
    '123,456,789'
    

    这当然仍然适用于较大的文本主体包含数字、点、数字、破折号、数字序列。

    format() 函数与str.format() method 密切相关,但不需要完整的字符串模板(因此不需要{} 占位符或字段名称)。

    【讨论】:

      【解决方案2】:

      你在这里要求一个完整的正则表达式,拆分你的字符串可能会更容易..

      >>> import re
      >>> s = '123456789.123456789-123456789'
      >>> '{:,}'.format(int(re.split('[.-]', s)[1]))
      123,456,789
      

      如果您更喜欢使用正则表达式,请在替换中使用函数调用或 lambda:

      >>> import re
      >>> s = '123456789.123456789-123456789'
      >>> re.sub(r'\d+\.(\d+)-\d+', lambda m: '{:,}'.format(int(m.group(1))), s)
      123,456,789
      

      您可以查看不同的format 规范。

      【讨论】:

        猜你喜欢
        • 2017-08-23
        • 1970-01-01
        • 1970-01-01
        • 2019-07-24
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-27
        相关资源
        最近更新 更多