使用含多捕获组与或运算符的正则拆分字符串返回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
相关产品推荐
相关产品推荐

