如何在python中替换子串的一部分?

时间:2018-04-13 07:05:40

标签: regex python-3.x

我有一个像

这样的文字

"Euro Style = $12,345,67, US Style = $12,345,67, $1,234"

我希望将字符串替换为

输出:

Euro Style = $12,345.67, US Style = $12,345.67, $1,234

即。只要有货币,当货币最后有2位数时,用逗号替换逗号。

我尝试使用正则表达式,但不知怎的,我错过了什么,请你帮忙。

add = "Euro Style = $12,345,67, US Style = $12,345,67, $1,234"
print(re.sub(r'([,][0-9]{2,}\B)+','.\2',add)) 

我的输出结果不正确

Euro Style = $12.5,67, US Style = $12.5,67, $1.4

2 个答案:

答案 0 :(得分:1)

您可以使用

re.sub(r'(?<=\d),(?=\d{1,2}(?!\d))', r'.', s)

请参阅regex demo

<强>详情

  • (?<=\d) - 数字必须在...之前。
  • , - 应该跟随的逗号......
  • (?=\d{1,2}(?!\d)) - 1位或2位数字(\d{1,2})未跟随其他数字((?!\d))。

Python test

import re
s="Euro Style = $12,345,67, US Style = $12,345,67, $1,234, $12,124,345,456 $0,89  $12,345,678"
print(re.sub(r'(?<=\d),(?=\d{1,2}(?!\d))', '.', s))
# => Euro Style = $12,345.67, US Style = $12,345.67, $1,234, $12,124,345,456 $0.89  $12,345,678

请注意,如果您的号码从未粘贴到_或字母,您也可以使用更简单的正则表达式和字边界:

(?<=\d),(?=\d{1,2}\b)
                  ^^ 

请参阅this regex demo

或者甚至 - 如果您不关心,之前是否有数字:

re.sub(r',(\d{1,2})\b', r'\1', s)

请参阅this regex demo

最后,如果您还需要将$12,212,12345678更改为$12,212.12345678

re.sub(r',(\d{1,2}|\d{4,})\b', r'.\1', s)

请参阅another regex demo

(\d{1,2}|\d{4,})是一个匹配1位或2位或4位以上的替换组,从而消除了3个数字块,后跟字边界。

答案 1 :(得分:1)

尝试

re.sub(r',(\d{2}\D)', r'.\1', add)

{2,}表示2个或更多数字。如果您想要完全匹配2,则需要提供{2}。使用\ D只是为了匹配除数字之外的任何其他内容。希望这可以帮助! -