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):