Python中的正则表达式:替换双引号之间多个逗号的出现

3

我试图找到一种方法,使用Python将csv文件中两个双引号之间出现的所有逗号替换为竖线。

给定这样的输入:

abc,def,"ghi,jkl,mno",pqr,stu

我想得到:

abc,def,"ghi|jkl|mno",pqr,stu

我尝试使用正向先行断言与类似于:

(?<=\")(此处应该匹配每个逗号)(?=\") 但是我无法让它起作用。有任何想法吗?


1
为什么不使用 csv 解析器直接读取此字符串,然后再使用 replace(',', '|') 替换逗号呢?顺便说一下,这并不是你可以使用前瞻的情况,你需要匹配有效的双引号字段,并且这可能不像 "[^"]+" 那么容易。为了正确地执行此操作,您应该知道如何转义字段内部的双引号。 - Wiktor Stribiżew
2个回答

5
使用 re.sub() 函数,将匿名函数或 lambda 函数用于替换部分。
>>> 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
双引号始终是平衡的,不会被转义。 - Egregore
@WiktorStribiżew 是的..已添加注释.. - Avinash Raj
谢谢,这看起来运行得很好。我之前不知道有lambda语法 :) - Egregore

0

像这样更简单的方法是否适合您:

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文件,我想避免逐行拆分。正则表达式解决方案也更短 :) - Egregore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接