찾기 및 바꾸기

단순한 replace_all 부터 중첩된 모양 제약까지

examples/find_replace.py + nbs/01_tutorials/02_find_and_replace.ipynb 에서 이식.

1. 단순 바꾸기

from hwpapi import App

with App() as app:
    app.new()
    app.doc.insert_text("Hello world. Hello universe. Hello python.\n")

    # 첫 번째 일치로 이동 (커서 이동; bool 반환)
    found = app.doc.find_text("Hello")
    print("find_text('Hello') →", found)

    # 모든 일치 항목 바꾸기
    count = app.doc.replace_all("Hello", "Hi")
    print(f"replace_all('Hello' → 'Hi'): {count} replacements")

2. 상세한 FindReplace ParameterSet

와일드카드 / 대소문자 구분 / 단어 단위 등의 제약 조건이 필요할 때는 AllReplace 액션으로 내려가 그 ParameterSet 을 설정합니다.

from hwpapi import App

with App() as app:
    app.new()
    app.doc.insert_text("Old text. Some other text. Old text again.\n")

    action = app.actions.AllReplace
    ps = action.pset  # FindReplace ParameterSet

    ps.FindString = "Old"
    ps.ReplaceString = "NEW"
    ps.IgnoreCase = 0            # 대소문자 구분
    ps.WholeWordOnly = 0
    ps.UseWildCards = 0

    action.run()
    print("Replaced 'Old' → 'NEW' (case-sensitive)")

3. 서식 제약 조건이 있는 찾기

FindReplace.find_char_shape 는 자동 생성되는 중첩 ParameterSet 입니다. 처음 접근할 때 내부적으로 CreateItemSet 을 호출하므로, 수동으로 구성할 필요가 없습니다.

from hwpapi import App

with App() as app:
    app.new()
    action = app.actions.FindReplace
    ps = action.pset

    ps.FindString = "important"

    # 자동 생성 중첩 ParameterSet
    ps.find_char_shape.Bold = True   # BOLD 인 항목만 찾기
    print("FindCharShape.Bold set:", ps.find_char_shape.Bold)

    # action.run() 을 호출하면 실제로 텍스트를 찾음 — 여기선 건너뜀

4. clone 을 이용한 스냅샷 / 복원

from hwpapi import App

with App() as app:
    action = app.actions.FindReplace
    ps = action.pset

    original = ps.clone()
    print("Snapshot:", repr(original))

    ps.FindString = "temporary"
    ps.IgnoreCase = 1
    print("Changed:", repr(ps))
    print("is_equivalent(original):", ps.is_equivalent(original))

    ps.update_from(original)
    print("Restored:", repr(ps))

5. 어떤 find 계열 액션이 존재하는가?

from hwpapi import App

with App() as app:
    for name in ['FindReplace', 'AllReplace', 'ForwardFind', 'BackwardFind']:
        if name in app.actions:
            cls = app.actions.get_pset_class(name)
            desc = app.actions.get_description(name)
            print(f"{name}{cls.__name__ if cls else 'None'}: {desc}")

함께 보기

맨 위로