You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式:忽略转义字符统计分号出现次数

验证CSV文件中条目数不符合要求的行

要解决这个问题,核心是准确统计每行中未被转义的分号(;)数量——因为转义的\;属于字段内容的一部分,不能作为分隔符。我们可以用正则表达式精准匹配非转义分号,再结合字段数判断找出异常行。

思路拆解

  1. 匹配非转义分号:用正则表达式(?<!\\);,其中(?<!\\)是负向零宽断言,确保匹配的分号前没有转义符\,这样就能跳过所有\;形式的转义内容。
  2. 计算字段数:每行的字段数 = 非转义分号的数量 + 1(分隔符数量永远比字段数少1)。
  3. 筛选异常行:找出字段数不等于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:29:35