세상의 변화에 대해 관심이 많은 이들의 Tech Blog search

파이썬 정규표현식(re) 사용법 - 09. 기타 기능

|

목차


파이썬 정규표현식(re) 사용법 - 01. Basic
파이썬 정규표현식(re) 사용법 - 02. 문자, 경계, flags
파이썬 정규표현식(re) 사용법 - 03. OR, 반복
파이썬 정규표현식(re) 사용법 - 04. 그룹, 캡처
파이썬 정규표현식(re) 사용법 - 05. 주석, 치환, 분리
파이썬 정규표현식(re) 사용법 - 06. 치환 함수, 양방탐색, 조건문
파이썬 정규표현식(re) 사용법 - 07. 예제(숫자)
파이썬 정규표현식(re) 사용법 - 08. 예제(단어, 행)
파이썬 정규표현식(re) 사용법 - 09. 기타 기능


이 글에서는 re 패키지에 포함된, 지금까지의 글에서 다루지 않았던 함수와 속성 등을 다루도록 하겠다.

본 글에서 정규표현식은 regex와 같이, 일반 문자열은 ‘regex’와 같이 표시하도록 한다.

파이썬 버전은 3.6을 기준으로 하나, 3.x 버전이면 (아마) 동일하게 쓸 수 있다.
2.7 버전은 한글을 포함한 비 알파벳 문자 처리가 다르다.


함수

re.escape(string)

re.escape 함수는 문자열을 입력받으면 특수문자들을 이스케이프 처리시켜 준다.

pattern = r'((\d)\2{4,})'
print(re.escape(pattern))

결과

\(\(\\d\)\\2\{4\,\}\)

re.purge()

사실 설명하지 않은 것이 있는데, re 패키지는 re.compile로 만들어 놓은 객체들을 cache에 저장해 둔다. 최대 100개까지라고 알려져 있으며, 그 수를 넘어갈 경우 초기화된다고 한다.
물론 여러분은 아마 한 프로그램 내에서 100개 이상의 다른 정규식을 쓸 일은 없으니 크게 신경 쓸 필요는 없다.

re.purge 함수는 이 cache를 초기화하는 함수이다.

re.purge()

결과

결과는 아무것도 출력되지 않는다.


속성

re.RegexFlag

이전 글에서 flags를 설명했었는데, 이 flag들이 어떤 것이 있는지 알려주는 객체가 re 안에 내장되어 있다.

for flag in re.RegexFlag:
    print(flag)

결과

RegexFlag.ASCII
RegexFlag.IGNORECASE
RegexFlag.LOCALE
RegexFlag.UNICODE
RegexFlag.MULTILINE
RegexFlag.DOTALL
RegexFlag.VERBOSE
RegexFlag.TEMPLATE
RegexFlag.DEBUG

re.TEMPLATE

아마 쓸 일이 없을 듯하므로 설명은 생략한다. (?)

다만 이런 것이 있다는 것만 소개한다.


re.DEBUG

reObj를 출력하면 컴파일한 정규식을 그대로 출력하던 것을 기억할 것이다. re.debug는 일종의 디버깅 모드로서, 정규식의 대략적인 구조를 알 수 있다.
말 그대로 디버깅용으로 쓰면 될 듯하다.

r = re.compile('\d{3,6}', re.DEBUG)
print(r)
print(r.findall('AS 123123 ars'))

결과

MAX_REPEAT 3 6
  IN
    CATEGORY CATEGORY_DIGIT
re.compile('\\d{3,6}', re.DEBUG)
['123123']

reObj의 사용법은 기본 compile된 객체와 완전히 같다.


re.error

re.error는 compile 함수에 전달된 문자열이 유효하지 않은 정규식일 때 발생하는 에러 타입이다. try-except 구문으로 처리하면 된다. 자세한 사용법은 아래 예시로만 보여도 충분할 듯 하다.

참고로 아래 코드의 phi는 원주율을 소수점 1만 자리까지 저장한 문자열이다.

regex_list = [
    r'((\d)\2{4,})',
    r'((\d)\1{4,})'
]

for regex in regex_list:
    try:
        reObj = re.compile(regex)
        print(list(map(lambda x: x[0], reObj.findall(phi))))
    except re.error:
        print("<Invalid regular expression %s>" % regex)
    finally:
        print('done')

결과

['999999']
done
<Invalid regular expression ((\d)\1{4,})>
done

무엇이 유효하지 않은지는 연습문제로 남겨두도록 하겠다.

조금 더 자세한 사용법은 여기를 참조한다.


이것으로 정규표현식에 대한 글을 마치도록 한다.
조금 더 복잡한 예제를 정리해 두면 좋겠지만, 그때그때 맞게 쓰는 것이 더 나을 것 같아서 굳이 따로 정리할 필요는 없을 것 같다.