Regex提取工作经历文本返回空值的问题排查及解决方法
正则提取简历工作经历问题分析与调整方案
问题描述
我用pdfminer提取了一段简历文本,希望编写通用正则逻辑提取“Work Experience”(包含EXPERIENCE、Job Experience等同义表述)与“Areas Of Expertise”(包含Skills、Education等分界词)之间的工作经历内容。尝试了以下正则模式:
pattern = r'^(?:EXPERIENCE|Employment experience|Work Experience|Work Experience|WORK EXPERIENCE|Previous Employment|Work Experience -|Job experience|)\s*(\S.*?)\n(?:Skills|EDUCATION|Education|SKILLS|Areas Of Expertise)' matches = re.findall(pattern, text, re.M | re.S) print(matches)
但返回结果为[],需要排查正则的问题并调整实现需求。
原正则的问题
- 行首锚定过于严格:
^要求标题必须严格在行首,但简历中标题可能存在缩进或前导空格,导致匹配失败。 - 空分支引发无效匹配:正则中的
|)空分支会匹配空字符串,干扰正常的标题匹配逻辑。 - 内容匹配边界模糊:
\S.*?\n的组合在re.S模式下,.会匹配换行符,加上非贪婪匹配,可能提前终止内容匹配;且分界词前的\n没有考虑中间可能存在的空白行。 - 分界词匹配未处理空白:分界词前后可能存在空格、缩进或换行,原正则直接用
\n衔接,无法适配这些场景。
调整后的正则方案
# 优化后的正则模式 pattern = r'(?:^|\n)\s*(?:EXPERIENCE|Employment experience|Work Experience|WORK EXPERIENCE|Previous Employment|Job experience|Work Experience -)\s*\n(.*?)\s*(?:\n|\Z)\s*(?:Skills|EDUCATION|Education|SKILLS|Areas Of Expertise)' # 仅使用re.S模式,确保.能匹配换行符 matches = re.findall(pattern, text, re.S) # 清理匹配结果中的多余空白 cleaned_matches = [match.strip() for match in matches] print(cleaned_matches)
调整说明
- 标题起始匹配更灵活:用
(?:^|\n)匹配标题的起始位置(行首或换行后),\s*匹配标题前后的任意空白(缩进、空格),适配简历中标题的排版差异。 - 移除空分支:删除原正则中的空选项分支,避免无效匹配干扰。
- 内容匹配逻辑优化:
(.*?)非贪婪匹配标题后到分界词前的所有内容,re.S模式让.包含换行符,确保能捕获多行工作经历。 - 分界词匹配兼容空白:
\s*(?:\n|\Z)\s*匹配内容与分界词之间的任意空白(包括空白行),\s*包裹分界词,处理分界词前后的空格或缩进。 - 结果清理:通过
strip()去除匹配结果首尾的多余空白,让提取的内容更整洁。
内容的提问来源于stack exchange,提问作者Roshankumar
相关产品推荐
相关产品推荐

