替换CSV文件中数字的逗号

时间:2018-10-02 07:20:42

标签: python regex

我有一个看起来像这样的文件:

文件以逗号分隔...但是,逗号也用于数字逗号。好处是,我只需要删除两个数字之间的逗号即可:

a,b,100,000.00,2018-01-01,c
c,d,20,000.0,2017-12-01,e
e,f,1,000,000.00,2015-11-10,g

并将其转换为:

a,b,100000.00,2018-01-01,c
c,d,20000.0,2017-12-01,e
e,f,1000000.00,2015-11-10,g

我本来打算使用(?<=\d),(?=\d+\.\d+),但这仅照顾(1000)位置的逗号,而不照顾(1000000)位置的逗号。有没有办法递归地做到这一点?或者,我可以两次调用此替换。

2 个答案:

答案 0 :(得分:3)

您可以使用

import re
s="""a,b,100,000.00,2018-01-01,c
c,d,20,000.0,2017-12-01,e
e,f,1,000,000.00,2015-11-10,g"""
print( re.sub(r"(?<![^,])\d{1,3}(?:,\d{3})*(?:\.\d+)?(?![^,])", lambda x: x.group().replace(',',''), s) )

请参见Python demo。输出:

a,b,100000.00,2018-01-01,c
c,d,20000.0,2017-12-01,e
e,f,1000000.00,2015-11-10,g

模式详细信息

  • (?<![^,])-逗号必须立即出现在字符串的左侧或开头
  • \d{1,3}-1到3位数字
  • (?:,\d{3})*-0个或多个序列
    • ,-逗号
    • \d{3}-三位数
  • (?:\.\d+)?-可选的.和1个以上的数字
  • (?![^,])-逗号必须立即出现在字符串的右边或结尾

使用lambda x: x.group().replace(',','')从找到的匹配项中删除所有逗号。

答案 1 :(得分:1)

使用积极的向后回顾和前瞻性regex

import re

s = 'a,b,100,000.00,c'
print(re.sub(r'(?<=\d),(?=\d)', '', s))
# a,b,100000.00,c
相关问题