Python正则表达式:替换CSV双引号内的多个逗号
嘿,这个问题我之前也踩过坑!你想用正向环视的思路方向没错,但单纯靠环视确实搞不定——因为环视是零宽度断言,它只检查前后有没有引号,没法精准限定“在一对双引号内部”这个范围,毕竟引号里的逗号前后是普通字符,不是引号呀。
下面给你两个可行的解决思路,按需选择:
解决思路1:正则回调函数(适合无转义引号的简单CSV)
我们可以先匹配所有被双引号包裹的完整字段,然后在每个匹配到的字段内部替换逗号为竖线。用re.sub的回调函数就能实现这个逻辑:
import re input_str = 'abc,def,"ghi,jkl,mno",pqr,stu' def replace_comma_in_quotes(match): # 取出匹配到的带引号字段,替换内部逗号为竖线 return match.group(0).replace(',', '|') output_str = re.sub(r'"[^"]*"', replace_comma_in_quotes, input_str) print(output_str) # 输出结果: abc,def,"ghi|jkl|mno",pqr,stu
小说明:
- 正则
"[^"]*"的作用是匹配从双引号开始,到下一个双引号结束的内容(注意:如果你的CSV里有转义双引号,比如"he said ""hello""",world,这个正则会失效,因为它会在第一个闭合引号处停止匹配)
解决思路2:用Python内置csv模块(适合复杂真实场景)
如果你的CSV可能存在转义引号、多行字段等复杂情况,强烈推荐用Python自带的csv模块,它会帮你正确解析CSV的结构,避免正则可能带来的各种坑:
import csv from io import StringIO input_str = 'abc,def,"ghi,jkl,mno",pqr,stu' # 用StringIO模拟文件流(如果是本地CSV文件,直接用open()打开即可) input_file = StringIO(input_str) reader = csv.reader(input_file) rows = list(reader) # 遍历每一行的每个字段,替换内部的逗号为竖线 processed_rows = [] for row in rows: processed_row = [field.replace(',', '|') for field in row] processed_rows.append(processed_row) # 将处理后的内容写回字符串 output_file = StringIO() writer = csv.writer(output_file) writer.writerows(processed_rows) # 去除末尾多余的换行符 output_str = output_file.getvalue().strip() print(output_str) # 输出结果: abc,def,"ghi|jkl|mno",pqr,stu
小说明:
csv.reader会自动把带引号的字段作为一个整体读取,不管里面有多少逗号或转义引号;处理完成后,csv.writer会自动按照CSV规范输出,确保格式正确。
内容的提问来源于stack exchange,提问作者Łukasz Biały




