Java String.split正则分割:忽略引号内逗号的实现需求
解决CSV分割时忽略引号内逗号的问题
这确实是用简单字符串分割处理CSV格式时常见的坑——普通的line.split(",")完全不会考虑引号的上下文,直接把所有逗号都当作分割符,自然会把引号里的内容拆得支离破碎。好在我们有两种靠谱的办法来解决这个需求:
方法1:使用Python内置的csv模块(推荐方案)
Python自带的csv模块是专门为处理CSV格式设计的,它天生就能识别引号包裹的字段,自动忽略引号内部的分隔符,还能处理很多CSV的边缘场景(比如转义引号、字段内换行等)。
示例代码
import csv # 替换成你的文件路径 with open('your_file.csv', 'r', newline='') as file: # skipinitialspace=True 会自动忽略字段前面的空格(比如", 383"里的空格) csv_reader = csv.reader(file, skipinitialspace=True) for row in csv_reader: print(row, f"[{len(row)} values]")
输出结果
针对你的输入内容:
ABD,2131 "AB, D", 383
运行代码后会得到:
['ABD', '2131'] [2 values] ['AB, D', '383'] [2 values]
完全符合你期望的结果。
方法2:使用正则表达式(适合简单场景)
如果不想引入csv模块,也可以用正则表达式来匹配符合要求的字段。核心思路是:要么匹配双引号包裹的完整内容(允许里面包含逗号),要么匹配不包含逗号的普通字段。
示例代码
import re # 正则规则:匹配引号包裹的内容,或不包含逗号的连续字符 field_pattern = re.compile(r'"[^"]+"|[^,]+') # 模拟文件中的行 lines = [ 'ABD,2131', '"AB, D", 383' ] for line in lines: # 提取所有匹配的字段 raw_fields = field_pattern.findall(line) # 清理字段:去掉前后空格和包裹的引号 cleaned_fields = [field.strip().strip('"') for field in raw_fields] print(cleaned_fields, f"[{len(cleaned_fields)} values]")
输出结果
同样会得到符合期望的输出:
['ABD', '2131'] [2 values] ['AB, D', '383'] [2 values]
注意事项
正则方案只适合比较简单的CSV场景,如果你的文件里存在转义引号(比如"He said ""Hello""", 123)或者字段内换行的情况,正则表达式会失效,这时候还是推荐用csv模块。
内容的提问来源于stack exchange,提问作者pshemek
相关产品推荐
相关产品推荐

