支持省略年字:数字后紧跟干支时按年份解析(民国二十五丙子)

This commit is contained in:
sansen
2026-09-21 14:37:14 +08:00
parent 2a6ce68e59
commit 705d93d20e
+9 -4
View File
@@ -316,6 +316,10 @@ _year_digits = '〇零一二三四五六七八九十廿卄卅卌' + '0123456789
_known_era_alt = '|'.join(sorted(KNOWN_ERAS_ALL, key=len, reverse=True))
_known_era_group = r'(?P<era>' + _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<year>' + _yd + r'+)年'
era_year = _known_era_group + r'(?P<year>' + _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<year>' + _yd + r'+)年'
_year_ahead = r'(?=' + _yd + r'+' + _year_suffix + r'|元年)'
era_year = _known_era_group + _year_ahead + r'(?P<year>' + _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):