diff --git a/backend/scripts/fill_weight_from_dosage.py b/backend/scripts/fill_weight_from_dosage.py index 8e6f234..495d896 100644 --- a/backend/scripts/fill_weight_from_dosage.py +++ b/backend/scripts/fill_weight_from_dosage.py @@ -246,6 +246,16 @@ def parse_weight_ranges(dosage_instructions): # ── 패턴8: 라벨 없이 체중 구간만 (반려동물 키워드 있을 때) ── if not ranges and ('개' in txt or '고양이' in txt or '반려' in txt or '애완' in txt): + # 8a: "Xkg 초과-Ykg 이하" / "Xkg 초과 ~ Ykg" (먼저 처리) + for m in re.finditer( + r'(\d+\.?\d*)\s*kg\s*초과\s*[-~~]?\s*(\d+\.?\d*)\s*kg(?:\s*(?:이하|까지))?', + txt + ): + wmin, wmax = float(m.group(1)), float(m.group(2)) + if wmax <= 60 and wmax > wmin: + add_range(None, wmin, wmax, None) + + # 8b: "X-Ykg" / "X~Ykg" 일반 범위 for m in re.finditer( r'(?:체중\s*)?(\d+\.?\d*)\s*[-~~]\s*(\d+\.?\d*)\s*kg', txt @@ -254,6 +264,8 @@ def parse_weight_ranges(dosage_instructions): if wmax <= 60 and wmax > wmin: add_range(None, wmin, wmax, None) + # 8c: "Xkg 이하" / "~Xkg" (최소=0) + # 단, "Akg 초과-Xkg 이하"는 8a에서 이미 처리되었으므로 제외 for m in re.finditer( r'(?:체중\s*)?[~~]\s*(\d+\.?\d*)\s*kg|(\d+\.?\d*)\s*kg\s*(?:이하|까지)', txt @@ -261,6 +273,11 @@ def parse_weight_ranges(dosage_instructions): val = m.group(1) or m.group(2) wmax = float(val) if wmax <= 60: + # "초과-Xkg 이하" 컨텍스트인지 확인 → 이미 8a에서 처리됨 + start = max(0, m.start() - 15) + before = txt[start:m.start()] + if '초과' in before: + continue add_range(None, 0, wmax, None) # 정렬 (min 기준)