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

使用含多捕获组与或运算符的正则拆分字符串返回None的问题求助

问题根源

你代码报错的核心原因是正则用了多个独立捕获组,re.split() 会把所有捕获组的匹配结果都按顺序返回,没有匹配到的捕获组就会返回 None,比如匹配到 Personal Info 时,后两个工作、教育的捕获组就返回None,过滤后会打乱分隔符和内容的对应顺序,自然丢数据。


修复方案

基础修正版本

把所有同义词放到同一个捕获组里,避免多分组返回None:

import re
# 所有标题同义词放在同一个捕获组,用|分隔,加忽略大小写标识适配不同书写格式
split_regex = r"(Personal Info|Personal|Personal Information|Work Experience|Work|Education|School|Certificates)"

text = "Personal Info\nText\nText\nText\nText\nWork Experience\nText\nText\nText\nText\nEducation\nText\nText\nText\nText\nText"

# split后过滤空值、None和纯空白内容,再按「标题-内容」两两分组
split_result = [i.strip() for i in re.split(split_regex, text, flags=re.IGNORECASE) if i and i.strip()]
res_dict = {}
for idx in range(0, len(split_result), 2):
    # 兼容最后一段没有内容的边界情况
    if idx + 1 < len(split_result):
        res_dict[split_result[idx]] = split_result[idx+1]

print(res_dict)

运行后即可得到完整的标题-内容映射,不会丢失数据。


兼容多场景优化版本

如果需要适配更多不同排版、不同表述的简历,可以做以下改进:

  • 建立标题同义词映射表,后续新增同义词直接改表即可,还能自动归一化标题:
import re
# 键是归一化后的标准标题,值是对应的同义词列表,支持中英文混合匹配
title_map = {
    "个人信息": ["Personal Info", "Personal", "Personal Information", "基本信息", "联系方式"],
    "工作经历": ["Work Experience", "Work", "工作经验", "职业经历"],
    "教育经历": ["Education", "School", "教育背景", "学历"],
    "证书信息": ["Certificates", "证书", "资格证"]
}
# 自动生成正则,用re.escape避免特殊字符导致正则报错
all_titles = [syn for synonyms in title_map.values() for syn in synonyms]
split_regex = rf"({'|'.join(re.escape(s) for s in all_titles)})"

# 可新增规则适配带格式的标题,比如标题前后带#、-、=等符号的情况
# split_regex = rf"(?:^|\W)({'|'.join(re.escape(s) for s in all_titles)})(?:\W|$)"

text = "### 基本信息\n姓名:张三\n电话:13xxxxxxxxx\n---\n工作经验\n2020-至今 XX公司 开发工程师\n# Education\nXX大学 计算机科学 本科"
split_result = [i.strip() for i in re.split(split_regex, text, flags=re.IGNORECASE) if i and i.strip()]

res_dict = {}
for idx in range(0, len(split_result), 2):
    if idx + 1 < len(split_result):
        raw_title = split_result[idx]
        # 把匹配到的原始标题归一化为标准key
        for standard_title, synonyms in title_map.items():
            if raw_title.lower() in [s.lower() for s in synonyms]:
                res_dict[standard_title] = split_result[idx+1]
                break

print(res_dict)
  • 可根据简历常见排版调整正则,适配标题全大写、标题前后带特殊符号、标题和内容同行等特殊场景。

内容的提问来源于stack exchange,提问作者Sander Berntsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:06:02