From 5c8a62c9743946c29ca2c4b87b757a5c73edae3b Mon Sep 17 00:00:00 2001 From: sansen Date: Fri, 7 Aug 2026 18:12:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AD=97=E7=AC=A6=E5=81=8F?= =?UTF-8?q?=E7=A7=BB2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- parser.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/parser.py b/parser.py index 25f3474..479b538 100644 --- a/parser.py +++ b/parser.py @@ -251,8 +251,8 @@ _patterns_dynasty = _build_pattern(with_dynasty=True) # === 主函数 === def extract_era_years(text): - # 去除标记用的方括号/尖括号(用户标注用,非原文内容) - text = text.replace('[', '').replace(']', '').replace('【', '').replace('】', '') + # 标注符号([]、【】)不参与匹配,但保留在文本中——位置偏移以原始文本为准 + # (含换行/空格/标注),仅在收尾时把标注符号从"原文"字段剔除 original_text = text simplified_text = normalize_chars(cc.convert(text)) results = [] @@ -382,10 +382,18 @@ def extract_era_years(text): if not (1000 <= year_num <= 2100): continue # 公元年后紧跟的干支(如"公元一九六〇年庚子"):无年号可锚定时, - # 干支就是年份的干支,并入同一日期单位并校验 + # 干支就是年份的干支,紧邻时并入同一日期单位——保证 位置[start:end]==原文, + # 前端可按范围整体替换;隔标注符号时(【公元一九六〇年】庚子)干支只摘入字段校验 ganzhi = simplified_text[end:end + 2] if ganzhi in _ganzhi_to_offset: end += 2 + else: + j = end + while j < len(simplified_text) and simplified_text[j] in '[]【】': + j += 1 + ganzhi = simplified_text[j:j + 2] + if ganzhi not in _ganzhi_to_offset: + ganzhi = None covered.update(range(start, end)) raw_fan = original_text[start:end] era_type = "公元纪年(中华人民共和国)" if year_num >= 1949 else "公元纪年(近代/其他)" @@ -638,6 +646,12 @@ def extract_era_years(text): if result.get("公元") is not None: result.setdefault("干支", gregorian_to_ganzhi(result["公元"])) + # === 收尾:原文剔除标注符号;位置保持原始文本偏移(含换行/空格/标注) === + for result in results: + start, end = result["位置"]["起始"], result["位置"]["结束"] + result["原文"] = ''.join(ch for ch in original_text[start:end] if ch not in '[]【】') + result["原文(简体)"] = ''.join(ch for ch in simplified_text[start:end] if ch not in '[]【】') + return results