본문 바로가기
아래아한글 자동화/pyhwpx 사용법

[pyhwpx] 파이썬 정규식으로 찾아바꾸기

by 일코 2024. 1. 23.
반응형

pyhwpx.Hwp().find_replace_all(src, dst, regex=True)

regex=True로 설정하면
re.sub와 동일한 방식으로 정규식 문법을 사용할 수 있다.

예를 들어 주민등록번호 패턴인
123456-1234567을 123456-1******로 변경하고자 하면,
(여러가지 구현이 있겠지만)

src = r"(\d{6})-(\d)\d{6}(?=\D|$)"
dst = r"\g<1>-\g<2>******"

hwp.find_replace_all(src, dst, regex=True)
Python

라고 코드를 입력하고 실행해보자.
시연화면은 아래와 같다.

정규식 찾아바꾸기 시연화면

바뀌기 전의 원본문서는 아래와 같고

원본문서

정규식 찾아바꾸기를 적용한 후의 문서는 아래와 같다.

변경된 문서

메서드 내부에서는 re.sub를 사용하지 않는다.

그 이유는 아래 접은글에

더보기

기존에 개인적으로 정규식 찾아바꾸기를 활용하던 방식은,
InitScan 및 GetText를 통해 한 문단씩 텍스트를 가져와서

re로 수정한 후 다시 한/글에 붙여넣는 방식이었는데
이 방법은 서식이 완전히 사라지거나, 미주/각주 등을 인식하지 못한다든지
하여튼 제한적이었다.

현재 메서드 안에서 사용하는 방식은,
GetTextFile로 문서 내 문자열 정보만 가져와서,
src_list만 찾은 후,
정규식 패턴과 re.sub를 통해 dst_list를 만든다.
그리고 해당 src와 dst로 일반 찾아바꾸기 메서드를 수행한다.

다소 무식한 방식이 아닐 수 없는데,
더 좋은 해법을 찾지 못했다.

아쉽게도 현재 버그가 하나 있다. 
**미주**의 경우에는 미주번호가 본문의 끝에 바로 이어서 오는 것으로 인식되기 때문에
위의 예제에서도 미주가 달린 본문의 주민등록번호는 변경하지 못했다.
본문 중간의 미주가 들어있는 라인 끝의 1112584¹ 을  11125841인 8자리 정수로 이해하기 때문에
정규식 매치에서 제외되어버렸다. 좋은 방법이 없을까?ㅜ

포스팅을 남기다 번뜩 든 생각인데,
InitScan / GetText만 사용해서 컨트롤 없이 본문만 한 번 찾아바꾸기를 돌리고,
나머지 기타영역은 GetTextFile을 이용해서 위 방식으로 돌리는,
두 단계 방식이면 위 문제가 해결될 것 같다. 조만간 다듬어서 업데이트해야지!ㅋ

반응형