Python正则表达式分割文本文件及CSV内容处理咨询
嘿,我来帮你搞定这个CSV处理的问题!先聊聊你问的正则分割方法,再给你推荐个更靠谱的方案——毕竟CSV里藏着不少坑,比如引号里的逗号,直接用正则搞不好就翻车~
一、用Python正则表达式分割CSV行
如果一定要用正则处理,核心是要区分引号内的内容(允许包含逗号)和不带引号的字段(不能有逗号)。这里给你写一个能处理大部分情况的正则和示例代码:
import re # 匹配CSV字段的正则:要么捕获带引号的内容(支持转义引号\"),要么捕获不带引号的非逗号内容 csv_field_pattern = re.compile(r'(?:"([^"\\]*(?:\\.[^"\\]*)*)"|([^,]+))') def split_csv_line(line): # 找到所有匹配的字段 matches = csv_field_pattern.findall(line) # 提取每个匹配组里的有效内容,同时把转义的\"还原成" processed_fields = [] for quoted, unquoted in matches: if quoted: processed_fields.append(quoted.replace('\\"', '"')) else: processed_fields.append(unquoted) return processed_fields # 测试你的示例行 sample_line = '10476195,"Very nice, thanks. I\'ll do more extensive research on that. :-)"' print(split_csv_line(sample_line)) # 输出结果: ['10476195', 'Very nice, thanks. I'll do more extensive research on that. :-)']
简单解释下这个正则的逻辑:
(?:"([^"\\]*(?:\\.[^"\\]*)*)":匹配被双引号包裹的内容,允许里面出现转义的引号(\"),并且捕获引号内的文本|([^,]+):如果没有引号,就匹配连续的非逗号字符,作为一个字段
二、更稳妥的CSV处理方案:用Python内置的
csv模块 说实话,正则处理CSV很容易踩边缘案例的坑——比如字段里有换行、多层转义、引号不配对之类的。Python自带的csv模块就是专门解决这些问题的,用它处理CSV才是生产环境里的首选,代码也更简洁:
import csv # 方式1:用csv.reader按行读取,返回的每一行是一个列表 with open('your_comments.csv', 'r', encoding='utf-8') as csv_file: reader = csv.reader(csv_file) for row in reader: # row[0]是ID,row[1]是评论内容 comment_id = row[0] comment_content = row[1] print(f"ID: {comment_id}, 评论: {comment_content}") # 方式2:用csv.DictReader,按字段名访问(如果你的CSV有表头的话) # 假设CSV第一行是"ID,Comment"这样的表头 with open('your_comments.csv', 'r', encoding='utf-8') as csv_file: reader = csv.DictReader(csv_file) for row in reader: comment_id = row['ID'] comment_content = row['Comment'] print(f"ID: {comment_id}, 评论: {comment_content}")
这个模块会自动帮你处理:
- 引号内的逗号、换行
- 转义的引号(比如
""或者\") - 各种不符合规范但常见的CSV格式问题
三、处理评论内容截断的情况
你示例里有"I have some enc..."这种截断内容,如果是文件本身的内容截断,csv模块读取时如果遇到未闭合的引号,会抛出异常。你可以加个异常捕获来跳过有问题的行:
import csv with open('your_comments.csv', 'r', encoding='utf-8') as csv_file: reader = csv.reader(csv_file) for line_num, row in enumerate(reader, start=1): try: comment_id = row[0] comment_content = row[1] print(f"第{line_num}行 - ID: {comment_id}, 评论: {comment_content}") except IndexError: print(f"警告:第{line_num}行格式无效,已跳过")
内容的提问来源于stack exchange,提问作者silviacamplani
相关产品推荐
相关产品推荐

