Python 用逗号替换中间数字作为千位分隔符

3 投票
2 回答
1629 浏览
提问于 2025-04-18 13:59

我有一个这样的字符串:

123456789.123456789-123456789

在小数点和连字符前后可以有任意数量的数字,我需要做的是去掉小数点前面的所有东西,包括小数点本身,同时去掉连字符和连字符后面的所有内容。然后,我需要对中间保留的数字加上千位分隔符的逗号。

所以这里的输出应该是:

123,456,789

我可以使用一些技巧来捕捉中间的数字,但这样就不能替换其他的数字了,而且我不太确定如何用这些技巧来加逗号。

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

然后我想到了可以用一个捕获组来实现这个功能,但我不太确定如何插入逗号。

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

我该如何使用上面提到的正则表达式来插入逗号呢?

2 个回答

4

你在这里请求一个完整的正则表达式,其实把你的字符串分开可能会更简单一些。

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

你可以看看不同的格式规范。

4

不要试图用正则表达式来插入千位分隔符;只需找出那个中间的数字,然后用一个函数来生成替换的结果;re.sub() 这个函数可以接受一个函数作为替换的模式:

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

在使用format()函数时,整数的,格式可以处理数字的千位分隔符:

>>> 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()方法关系密切,但它不需要完整的字符串模板(所以不需要{}占位符或字段名称)。

撰写回答