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

使用正则提取百科条目生卒信息遇匹配问题,求原因分析

正则表达式提取生卒信息的问题分析

问题背景

需要从以下百科条目中提取出生日期、出生地点,以及(存在时)死亡日期、死亡地点:

威廉·华兹华斯,(生于1770年4月7日,英格兰坎伯兰郡科克茅斯——卒于1850年4月23日,威斯特摩兰郡赖德尔山),英国诗人...
简·古道尔,全名女爵简·古道尔,原名瓦莱丽·简·莫里斯-古道尔,(生于1934年4月3日,英格兰伦敦),英国动物行为学家...
肯尼思·沃廷比·斯彭斯,(生于1907年5月6日,美国伊利诺伊州芝加哥——卒于1967年1月12日,得克萨斯州奥斯汀),美国心理学家...

最初尝试的正则模式无法达到预期:

\(born (\w+ \d{1,2}, \d{4})(?:, )(.*?)(?:—died )?(\w+ \d{1,2}, \d{4})?(?:, )?(.*?)\)

重构后的模式仅能匹配含死亡信息的条目,无法适配所有情况:

\(born (\w+ \d{1,2}, \d{4})(?:, )(.*?)—died (\w+ \d{1,2}, \d{4})?(?:, )?(.*?)\)

核心问题

你忽略了三个关键问题:

  • 日期格式完全不匹配:示例条目是中文日期(如1770年4月7日),但你的正则写的是英文日期规则(\w+ \d{1,2}, \d{4},对应April 7, 1770),这直接导致连出生日期都匹配不到。
  • 非贪婪匹配的边界模糊:.*?没有明确的终止标记,在没有死亡信息的条目里,它会和后续的可选死亡组产生冲突,无法正确终止到括号)。
  • 分支逻辑缺失:没有处理“要么有——卒于分支,要么直接到括号结尾”的两种情况,导致无死亡信息的条目匹配失败。

修正后的正则

针对中文条目调整规则,同时覆盖两种情况:

\(生于(\d{4}年\d{1,2}月\d{1,2}日)(?:,(.*?))?(?:——卒于(\d{4}年\d{1,2}月\d{1,2}日)(?:,(.*?))?)?\)

规则说明

  1. 匹配中文关键词生于和卒于,而非英文的born/died
  2. 日期格式适配中文的年/月/日结构
  3. 用可选分组包裹死亡信息部分,无死亡信息时自动跳过
  4. 每个地点的非贪婪匹配被限定在对应分组内,避免越界

匹配结果

  • 威廉·华兹华斯条目:捕获组1=1770年4月7日,组2=英格兰坎伯兰郡科克茅斯,组3=1850年4月23日,组4=威斯特摩兰郡赖德尔山
  • 简·古道尔条目:捕获组1=1934年4月3日,组2=英格兰伦敦,组3/组4为空
  • 肯尼思条目:捕获组1=1907年5月6日,组2=美国伊利诺伊州芝加哥,组3=1967年1月12日,组4=得克萨斯州奥斯汀

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:45:11