我有一个看起来像这样的文件:
文件以逗号分隔...但是,逗号也用于数字逗号。好处是,我只需要删除两个数字之间的逗号即可:
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)位置的逗号。有没有办法递归地做到这一点?或者,我可以两次调用此替换。
答案 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