fix: resolve I1 date parsing regression and implement strict volume cross-checking gate

This commit is contained in:
2026-07-30 10:49:33 +09:00
parent 7943b9390f
commit c3c18422a4
5 changed files with 109 additions and 62 deletions
@@ -27,44 +27,50 @@ def to_iso(raw):
return None
raw = raw.strip()
# 1) YYYY-MM-DD or YYYY.MM.DD
m = re.search(r'(\d{4})[. /\\-]?(\d{1,2})[. /\\-]?(\d{1,2})', raw)
if m:
yr = int(m.group(1))
mo = int(m.group(2))
day = int(m.group(3))
if mo <= 12 and day <= 31:
return f"{yr:04d}-{mo:02d}-{day:02d}"
# 2) "May 2026", "Feb. 2008", "August 2018"
m_txt = re.search(r'([A-Za-z]+)\.?\s*(\d{4})', raw)
# 1) English month + 19XX/20XX year: "April 2026", "Feb. 2008", "August, 2018"
m_txt = re.search(r'([A-Za-z]+)\.?\s*,?\s*((?:19|20)\d{2})', raw)
if m_txt:
mo_str = m_txt.group(1).lower().rstrip('.')
yr_str = m_txt.group(2)
if mo_str in MONTH_MAP:
return f"{yr_str}-{MONTH_MAP[mo_str]}"
# 3) "2019년 12월", "9월, 1999"
m_kor = re.search(r'(\d{4})년\s*(\d{1,2})월', raw)
# 2) Korean "2026년 6월", "9월, 1999"
m_kor = re.search(r'((?:19|20)\d{2})년\s*(\d{1,2})월', raw)
if m_kor:
return f"{int(m_kor.group(1)):04d}-{int(m_kor.group(2)):02d}"
yr = int(m_kor.group(1))
mo = int(m_kor.group(2))
if 1 <= mo <= 12:
return f"{yr:04d}-{mo:02d}"
m_kor2 = re.search(r'(\d{1,2})월.*?,?\s*(\d{4})', raw)
m_kor2 = re.search(r'(\d{1,2})월\s*,?\s*((?:19|20)\d{2})', raw)
if m_kor2:
return f"{int(m_kor2.group(2)):04d}-{int(m_kor2.group(1)):02d}"
mo = int(m_kor2.group(1))
yr = int(m_kor2.group(2))
if 1 <= mo <= 12:
return f"{yr:04d}-{mo:02d}"
# 4) YYYY-MM or YYYY.MM
m_ym = re.search(r'(\d{4})[. /\\-]?(\d{1,2})', raw)
# 3) ISO date: YYYY-MM-DD, YYYY.MM.DD (where YYYY is 19XX or 20XX)
m = re.search(r'((?:19|20)\d{2})[. /\\-]?(\d{1,2})[. /\\-]?(\d{1,2})', raw)
if m:
yr = int(m.group(1))
mo = int(m.group(2))
day = int(m.group(3))
if 1 <= mo <= 12 and 1 <= day <= 31:
return f"{yr:04d}-{mo:02d}-{day:02d}"
# 4) ISO month: YYYY-MM or YYYY.MM
m_ym = re.search(r'((?:19|20)\d{2})[. /\\-]?(\d{1,2})', raw)
if m_ym:
yr = int(m_ym.group(1))
mo = int(m_ym.group(2))
if mo <= 12:
if 1 <= mo <= 12:
return f"{yr:04d}-{mo:02d}"
# 5) YYYY only
m_y = re.search(r'(\d{4})', raw)
# 5) 19XX or 20XX year only
m_y = re.search(r'((?:19|20)\d{2})', raw)
if m_y:
return f"{int(m_y.group(1)):04d}"
return f"{m_y.group(1)}"
return raw