From 705d93d20ea3460206421e165e01e23c3ae267c2 Mon Sep 17 00:00:00 2001 From: sansen Date: Mon, 21 Sep 2026 14:37:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=9C=81=E7=95=A5=E5=B9=B4?= =?UTF-8?q?=E5=AD=97=EF=BC=9A=E6=95=B0=E5=AD=97=E5=90=8E=E7=B4=A7=E8=B7=9F?= =?UTF-8?q?=E5=B9=B2=E6=94=AF=E6=97=B6=E6=8C=89=E5=B9=B4=E4=BB=BD=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=EF=BC=88=E6=B0=91=E5=9B=BD=E4=BA=8C=E5=8D=81=E4=BA=94?= =?UTF-8?q?=E4=B8=99=E5=AD=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- parser.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/parser.py b/parser.py index 5edbde8..441fce6 100644 --- a/parser.py +++ b/parser.py @@ -316,6 +316,10 @@ _year_digits = '〇零一二三四五六七八九十廿卄卅卌' + '0123456789 _known_era_alt = '|'.join(sorted(KNOWN_ERAS_ALL, key=len, reverse=True)) _known_era_group = r'(?P' + _known_era_alt + r')' _yd = '[' + _year_digits + ']' +# 年份后缀:"年"字可省,但只在紧跟合法干支时才成立——碑谱/契约常见写法 +# ("光绪二十六庚子" = 光绪二十六年庚子,"民国二十五丙子" = 民国二十五年丙子)。 +# 干支是判定依据:省"年"的年份后面必然跟干支,否则不认(防止"康熙二十"这类普通数字误匹配)。 +_year_suffix = r'(?:年|(?=' + _gz_pair + r'))' def _build_pattern(with_dynasty=True): """构建年号正则:已知年号优先 + 通用兜底(仅限有朝代前缀时)""" @@ -330,7 +334,7 @@ def _build_pattern(with_dynasty=True): if with_dynasty: # 有朝代前缀:年号后直接跟年份数字,无需额外约束 - era_year = _known_era_group + r'(?P' + _yd + r'+)年' + era_year = _known_era_group + r'(?P' + _yd + r'+)' + _year_suffix era_yuan = _known_era_group + r'元年' patterns = [ re.compile(dynasty_part + boundary + era_year), @@ -341,8 +345,8 @@ def _build_pattern(with_dynasty=True): ] else: # 无朝代前缀:年号后必须紧跟年份数字(前瞻断言),防止"永乐大帝"误匹配 - _year_ahead = r'(?=' + _yd + r'+年|元年)' - era_year = _known_era_group + _year_ahead + r'(?P' + _yd + r'+)年' + _year_ahead = r'(?=' + _yd + r'+' + _year_suffix + r'|元年)' + era_year = _known_era_group + _year_ahead + r'(?P' + _yd + r'+)' + _year_suffix era_yuan = _known_era_group + _year_ahead + r'元年' patterns = [ re.compile(dynasty_part + boundary + era_year), @@ -418,7 +422,8 @@ def extract_era_years(text): # === 1. 民国 === minguo_pattern = re.compile( - r'民[国國]\s*([〇零一二三四五六七八九十百廿卄卅卌元\d0-9壹貳贰叁肆伍陸陆柒捌玖拾]+)\s*年' + r'民[国國]\s*([〇零一二三四五六七八九十百廿卄卅卌元\d0-9壹貳贰叁肆伍陸陆柒捌玖拾]+)\s*' + + _year_suffix + _mg_gy_paren ) for m in minguo_pattern.finditer(simplified_text):