You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动