Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 문자열에서 ANSI 이스케이프 시퀀스를 제거하는 방법

터미널에서 색상이나 커서 위치 등을 표현하기 위해 사용되는 ANSI 이스케이프 시퀀스는 로그 파일을 처리하거나 콘솔 출력을 파싱할 때 불필요한 문자로 남게 됩니다. 파이썬에서는 re 모듈의 정규표현식을 활용하면 이러한 시퀀스를 간단하게 제거할 수 있습니다.

정규표현식으로 ANSI 이스케이프 시퀀스 제거하기

핵심 아이디어는 간단합니다. ANSI 이스케이프 시퀀스에 해당하는 패턴을 찾아내고, re.sub() 함수를 사용해 빈 문자열('')로 치환하면 됩니다. 일반적으로 널리 사용되는 패턴은 다음과 같습니다.

r'(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]'

이 패턴은 ESC(\x1B) 또는 CSI(\x9B) 문자로 시작하고, 그 뒤에 오는 매개변수·중간 바이트·종료 문자까지 전부 매칭하여 완전한 이스케이프 시퀀스를 잡아냅니다.

예제 코드

import re

def escape_ansi(line):
    ansi_escape = re.compile(r'(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]')
    return ansi_escape.sub('', line)

print(escape_ansi(line='\t\u001b[0;35mSomeText\u001b[0m\u001b[0;36m172.18.0.2\u001b[0m'))

위 코드는 마젠타와 청록색으로 색상이 입혀진 텍스트에서 ANSI 코드를 제거합니다. 실행 결과는 다음과 같습니다.

'\tSomeText 172.18.0.2'

더 견고한 패턴이 필요하다면

위 패턴은 대부분의 경우에 충분하지만, 8비트 C1 제어 문자나 특수한 시퀀스까지 처리해야 한다면 다음과 같이 확장된 패턴을 사용하는 것이 좋습니다.

ansi_escape = re.compile(
    r'(?:\x1B[@-Z\\-_]|[\x80-\x9A\x9C-\x9F]|(?:\x1B\[|[\x9B\x9C])[0-?]*[ -\/]*[@-~])'
)

이처럼 정규표현식 하나만으로도 별도의 외부 라이브러리 없이 ANSI 이스케이프 시퀀스를 깔끔하게 제거할 수 있으며, 로그 정제나 터미널 출력 후처리 작업에 유용하게 활용할 수 있습니다.