# -*- coding: utf-8 -*- """글 속 계산용 수 → 그룹 계수 표 (build_소요량_건설품셈_토목.py 가 씀). 표에 붙은 주(①…)와 비고 글에서 정규식으로 수를 읽음(손으로 적지 않음). 주 한 줄마다 계수 표 하나. """ import re from _md표_읽기 import R from _토목_표 import conds_out PCT = r"([\d.]+)%" def clean(line): return re.sub(r"^(비고\s*-?\s*|-\s*|[①-⑳]\s*)", "", line).strip() def rows_of(line): """주 한 줄 → 계수 줄들 [(구분, 값, 단위, 딸린 칸)].""" s = clean(line) out = [] m = re.search(r"^(.+?)(?:는|은) (인력품|주재료비|재료비)의 " + PCT, s) if m: out.append((m.group(1), R(m.group(3)), "%", {"기준": m.group(2)})) m2 = re.search(r"(블록 정밀절단\(전동절단기\)에 의한 시공이 아닌 경우) " + PCT, s) if m2: out.append((f"{m.group(1)} — {m2.group(1)}", R(m2.group(2)), "%", {"기준": m.group(2)})) return out m = re.search( r"(시공량|본 품|크레인\(시간\))(?:의|을) " + PCT + r"(?:를|까지| 범위 내에서) ?(감|가산)", s ) if m: out.append((s, R(m.group(2)), "%", {"기준": m.group(1), "가감": m.group(3)})) m = re.search(r"(특별인부) (\d+)인을 감", s) if m: out.append((s, R(m.group(2)), "인", {"기준": m.group(1), "가감": "감"})) m = re.search(r"절단품은 본 품의 " + PCT + r", 선단가공\(Beveling\) 품은 본 품의 " + PCT, s) if m: out.append(("금긋기 및 절단품", R(m.group(1)), "%", {"기준": "본 품"})) out.append(("선단가공(Beveling) 품", R(m.group(2)), "%", {"기준": "본 품"})) m = re.search(r"두께 ([\d.]+)㎝일 때 ([\d,]+)㎡당 살수량은 일반적으로 ([\d.]+)ton", s) if m: out.append(("살수량 기준 두께", R(m.group(1)), "㎝", {})) out.append(("살수량 기준 면적", R(m.group(2)), "㎡", {})) out.append(("살수량", R(m.group(3)), "ton", {})) m = re.search(r"보통인부 (\d+)인기준 두께 (\d+)㎝시 ([\d,]+)㎡, 두께 (\d+)㎝시 ([\d,]+)㎡", s) if m: out.append(("모래 부설 일당시공량 기준 인원", R(m.group(1)), "인", {"기준": "보통인부"})) out.append((f"모래 부설 일당시공량 두께 {m.group(2)}㎝", R(m.group(3)), "㎡", {})) out.append((f"모래 부설 일당시공량 두께 {m.group(4)}㎝", R(m.group(5)), "㎡", {})) m = re.search(r"굴착기\(규격 ([\d.]+)㎥, 사용시간 ([\d.]+)hr\)", s) if m: out.append(("크레인 대체 굴착기 규격", R(m.group(1)), "㎥", {})) out.append(("크레인 대체 굴착기 사용시간", R(m.group(2)), "hr", {})) m = re.search(r"호칭압력 ([\d.]+)(㎏/㎠)를 기준", s) if m: out.append(("호칭압력 기준", R(m.group(1)), m.group(2), {})) m = re.search(r"강관장 ([\d.]+)m를 기준", s) if m: out.append(("강관장 기준", R(m.group(1)), "m", {})) return out def lift(chdir, text, out, rows_fn=rows_of): src_tabs = list(out.tables) for t in src_tabs: ident = t["열쇠"].split()[0] tags = {} for line in t["주"]: rs = rows_fn(line) if not rs: continue mt = re.match(r"[①-⑳]", line) tag = "비고" if line.startswith("비고") else "주" + (mt.group(0) if mt else "") tags.setdefault(tag, []).extend(rs) for tag, rs in tags.items(): cols, rows = {"값": "구분 따름", "단위": "글"}, [] for g, v, u, extra in rs: rows.append({"구분": g, "값": v, "단위": u, **extra}) for k in extra: cols.setdefault(k, "글") label = f"{t['이름']} 계수 {tag}" key = f"{ident} {label}" if key in out.keys: continue out.keys.add(key) out.tables.append( { "열쇠": key, "이름": label, "기준": "", "출처": f"{t['출처']} {tag}", "그룹": "계수", "조건": conds_out(["구분"], rows), "값칸": cols, "줄": rows, "주": [], } )