我试图找到一种方法,使用Python将csv文件中两个双引号之间出现的所有逗号替换为竖线。
给定这样的输入:
abc,def,"ghi,jkl,mno",pqr,stu
我想得到:
abc,def,"ghi|jkl|mno",pqr,stu
我尝试使用正向先行断言与类似于:
(?<=\")(此处应该匹配每个逗号)(?=\")
但是我无法让它起作用。有任何想法吗?
>>> import re
>>> s = 'abc,def,"ghi,jkl,mno",pqr,stu'
>>> re.sub(r'"[^"]+"', lambda x: x.group().replace(',', '|'), s)
'abc,def,"ghi|jkl|mno",pqr,stu'
r'"[^"]+"'
的解决方案没有考虑到字段值内部的字面 "
。 - Wiktor Stribiżew像这样更简单的方法是否适合您:
string = 'abc,def,"ghi|jkl|mno",pqr,stu'
string_splited = string.split('"')
string_splited[1] = string_splited[1].replace(',', '|')
这将给你一个列表:
>>> string_splited
['abc,def,', 'ghi|jkl|mno', ',pqr,stu']
你可以重新组装
>>> '"'.join(string_splited)
'abc,def,"ghi|jkl|mno",pqr,stu'
csv
解析器直接读取此字符串,然后再使用replace(',', '|')
替换逗号呢?顺便说一下,这并不是你可以使用前瞻的情况,你需要匹配有效的双引号字段,并且这可能不像"[^"]+"
那么容易。为了正确地执行此操作,您应该知道如何转义字段内部的双引号。 - Wiktor Stribiżew