正则表达式:忽略转义字符统计分号出现次数
验证CSV文件中条目数不符合要求的行
要解决这个问题,核心是准确统计每行中未被转义的分号(;)数量——因为转义的\;属于字段内容的一部分,不能作为分隔符。我们可以用正则表达式精准匹配非转义分号,再结合字段数判断找出异常行。
思路拆解
- 匹配非转义分号:用正则表达式
(?<!\\);,其中(?<!\\)是负向零宽断言,确保匹配的分号前没有转义符\,这样就能跳过所有\;形式的转义内容。 - 计算字段数:每行的字段数 = 非转义分号的数量 + 1(分隔符数量永远比字段数少1)。
- 筛选异常行:找出字段数不等于6的行即可。
代码实现(Python)
import re def count_unescaped_semicolons(line): # 匹配所有未被转义的分号 matches = re.findall(r'(?<!\\);', line) return len(matches) # 你的CSV数据(按行拆分,注意转义符在字符串中要写双反斜杠) csv_lines = [ "Number;Lastname or Company;Firstname;City;Postcode;Amount;", "1;Trump;Donald;Washington;12345;4;", "2;Bush;George;Washington;54321;1;", "3;Lloyds\\; and Firends;;11111;2;", "4;Schuhmacher\\;Frenzen\\;Fettel; and Co;Company;Anywhere;22222;3;", "5;Best\\;Friends;Company\\;Co;Nowhere;33333;4;" ] # 检查每行的字段数是否符合要求 print("条目数不为6的行:") for line_num, line in enumerate(csv_lines, 1): semicolon_count = count_unescaped_semicolons(line) field_count = semicolon_count + 1 # 假设正确的有效字段数是6,对应需要5个非转义分号 if semicolon_count != 5: print(f"行{line_num}: {line}") print(f" 非转义分号数量:{semicolon_count},实际字段数:{field_count}\n")
运行结果
条目数不为6的行: 行1: Number;Lastname or Company;Firstname;City;Postcode;Amount; 非转义分号数量:6,实际字段数:7 行4: 4;Schuhmacher\;Frenzen\;Fettel; and Co;Company;Anywhere;22222;3; 非转义分号数量:7,实际字段数:8 行5: 5;Best\;Friends;Company\;Co;Nowhere;33333;4; 非转义分号数量:6,实际字段数:7
结果说明
- 表头行末尾多了一个分号,导致字段数为7,不符合要求;
- 行4的字段分隔符明显过多,即使忽略转义分号,仍有7个非转义分号,字段数达8;
- 行5同样因末尾多了一个分号,最终字段数为7。
如果你的业务允许末尾带空字段(即最后一个分号后无内容),可以将判断条件改为field_count != 7,但根据需求“条目数不为6”,应该是指有效数据字段为6,所以当前逻辑更贴合需求。
内容的提问来源于stack exchange,提问作者Urvah Shabbir
相关产品推荐
相关产品推荐

