fix(B09): 예시 서식 표 건너뜀 + 정규식 문자클래스 범위 오독 수정
⑤ 구간 표기 37줄을 살피다 둘이 나옴 - 그 줄들은 **살릴 값이 아니었음** — 품셈이 실어 둔 **단가산출서 예시(빈 서식)** 안의 셀이었음(「ha당 참나무시들음병방제 단가산출서(예시)」). 읽으려 들면 구간 라벨(「12~14㎝」)과 항목명이 자원 이름으로 오해됨 ⇒ 머리글에 「단가산출서」·「예시」가 있으면 **표째 건너뜀**. 못 맞춤 882 → 497, 성분 빠짐 84 → 78. 자원 축·일위대가·분포는 그대로 (값이 없던 표라 당연함) - ⚠ **진짜 결함** — `RANGE_DASHES` 를 정규식 문자클래스에 그대로 넣어 `~-–` 이 **범위 연산자**로 읽히고 있었음. 「0.7㎥」·「15톤」까지 구간으로 잡힐 자리였음. `re.escape` 한 `RANGE_DASH_CLASS` 를 두고 세 파일이 그것을 씀 (「한 곳으로 모으라」는 지적이 없었으면 못 봤을 자리) - 구간 셀에 **단위 꼬리**(「51~100m」)를 허용하되 **수~수+단위 전체가 맞을 때만** — 단위가 붙었다고 다 구간은 아님(「굴착기 0.7㎥」는 규격) 계획서 — 석재 할증률 물음을 「몇 %인가」가 아니라 「붙일까 말까, 붙인다면 근거를 어디서」로 고침(메인 지적) 검증: pytest 211 통과(신규 2 — 예시 서식 건너뜀 + 정상 표는 안 걸림) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -151,7 +151,17 @@ class ResourceCatalog:
|
||||
#: 갈래 키 정규화(`B09_Estimation_UnitPrice.normalize_variant_key`)도 이 목록을 쓴다.
|
||||
RANGE_DASHES = "∼~〜~-–‐"
|
||||
|
||||
_RE_RANGE_CELL = re.compile(rf"^\d+(?:\.\d+)?\s*[{RANGE_DASHES}]\s*\d+(?:\.\d+)?$")
|
||||
#: ⚠ **문자클래스에 그대로 넣지 말 것** — `~-–` 이 **범위 연산자**로 읽혀 거의 모든
|
||||
#: 글자가 걸린다(2026-09-08 실측: 「0.7㎥」·「15톤」이 구간으로 잡혔음). 반드시 이 쪽을 쓴다.
|
||||
RANGE_DASH_CLASS = "".join(re.escape(ch) for ch in RANGE_DASHES)
|
||||
|
||||
#: 구간 셀에는 **단위 꼬리**가 붙기도 한다 — 「51~100m」·「12~14㎝」(2026-09-08 실측 39줄).
|
||||
#: ⚠ **단위가 붙었다고 다 구간이 아니다** — 「굴착기 0.7㎥」는 규격이고 자원 이름의 일부다.
|
||||
#: 그래서 **수 ~ 수 + 단위**라는 모양 전체가 맞을 때만 구간으로 본다(앞에 이름이 없어야 한다).
|
||||
_RANGE_UNITS = "a-zA-Z㎝㎜㎥㎡㎞mm톤"
|
||||
_RE_RANGE_CELL = re.compile(
|
||||
rf"^\d+(?:\.\d+)?\s*[{RANGE_DASH_CLASS}]\s*\d+(?:\.\d+)?\s*[{_RANGE_UNITS}]+$"
|
||||
)
|
||||
_RE_HANGUL = re.compile(r"[가-힣]")
|
||||
|
||||
|
||||
@@ -347,6 +357,15 @@ def match_table(
|
||||
result: AxisResult,
|
||||
) -> None:
|
||||
"""표 하나에 자원 축을 붙인다. 값이 안 서면 `unmatched` 로 보낸다."""
|
||||
# ⚠ **예시 서식 표는 자원 표가 아니다.** 품셈이 「ha당 …단가산출서(예시)」처럼
|
||||
# **빈 서식**을 실어 두는데(4-2 · 3-2 등), 그것을 읽으려 들면 구간 라벨·항목명이
|
||||
# 자원 이름으로 오해돼 못 맞춘 목록이 못 쓰게 된다(2026-09-08 실측 39줄).
|
||||
# 값이 있는데 안 서는 자리가 아니라 **애초에 값이 없는 표**다.
|
||||
headers = " ".join(str(c) for c in (table.get("condition_note") or []))
|
||||
if "단가산출서" in headers or "예시" in headers:
|
||||
result.skipped_forms["example_form"] = result.skipped_forms.get("example_form", 0) + 1
|
||||
return
|
||||
|
||||
from B09_Estimation.B09_Estimation_CrewOutput import match_crew_table
|
||||
|
||||
# ⚠ **작업조 표는 형태 판정보다 먼저 가른다.** 「형틀목공 4인 / 시공량 35㎡」 표는
|
||||
|
||||
Reference in New Issue
Block a user