re — 정규 표현식 연산

re — 정규 표현식 연산

re 모듈은 Perl 에서 찾을 수 있는 것과 비슷한 정규 표현식 일치 연산을 제공해요. 패턴과 검색할 문자열 모두 Unicode 문자열(str)과 8비트 문자열(bytes)일 수 있어요. 그러나 Unicode 문자열과 8비트 문자열은 섞을 수 없어요. 즉 bytes 패턴으로 Unicode 문자열을 일치시킬 수 없고 그 반대도 마찬가지예요. 대입(substitution)을 요청할 때도 치환 문자열이 패턴과 검색 문자열과 같은 타입이어야 해요.

출처: Python documentation

본문

정규 표현식은 특수 형식을 나타내거나 특수 의미를 호출하지 않고 특수 문자를 사용하려고 백슬래시 문자('\')를 사용해요. 이는 문자열 리터럴에서 같은 목적으로 같은 문자를 쓰는 파이썬의 용법과 충돌해요. 해결책은 파이썬의 raw 문자열 표기를 사용하는 것이에요. 'r' 접두사가 붙은 문자열 리터러에서는 백슬래시가 특별히 처리되지 않아요. 따라서 r"\n"'\''n' 을 담은 두 문자 문자열이고, "\n" 은 개행 하나를 담은 한 문자 문자열이에요. 보통 패턴은 이 raw 문자열 표기로 표현돼요.

대부분의 정규 표현식 연산은 모듈 레벨 함수와 컴파일된 정규 표현식의 메서드로 사용할 수 있어요. 함수는 정규식 객체를 먼저 컴파일할 필요가 없는 단축키이지만, 일부 미세 조정 매개변수가 빠져 있어요.

정규 표현식 문법 (Regular Expression Syntax)

정규 표현식(RE)은 그에 일치하는 문자열의 집합을 지정해요. RE 는 연결(concatenation)해 새 RE 를 만들 수 있어요. AB 가 모두 RE 면 AB 도 RE 예요. 특수 문자와 일반 문자를 모두 포함할 수 있어요. 'A', 'a', '0' 같은 대부분의 일반 문자는 가장 단순한 RE 로 단순히 자기 자신에 일치해요.

반복 연산자 또는 수량자(*, +, ?, {m,n} 등)는 직접 중첩할 수 없어요. 특수 문자는 다음과 같아요.

  • . (점) — 기본 모드에서 개행을 제외한 모든 문자와 일치. DOTALL 플래그를 지정하면 개행을 포함한 모든 문자와 일치.
  • ^ (캐럿) — 문자열의 시작과 일치하고, MULTILINE 모드에서는 각 개행 직후에도 일치.
  • $ — 문자열의 끝 또는 끝의 개행 직전과 일치하고, MULTILINE 모드에서는 개행 앞에서도 일치.
  • * — 앞 RE 의 0회 이상 반복(가능한 많이)과 일치.
  • + — 앞 RE 의 1회 이상 반복과 일치.
  • ? — 앞 RE 의 0회 또는 1회 반복과 일치.
  • *?, +?, ?? — 비탐욕적(non-greedy) 또는 최소 방식으로 가능한 한 적은 문자와 일치.
  • *+, ++, ?+ — 소유적(possessive) 수량자. 실패 시 역추적(back-tracking)을 허용하지 않아요. 버전 3.11 추가.
  • {m} — 앞 RE 의 정확히 m 번 반복과 일치.
  • {m,n} — 앞 RE 의 m 부터 n 번 반복과 일치(가능한 한 많이).
  • {m,n}? — 앞 RE 의 m 부터 n 번 반복과 일치(가능한 한 적게).
  • {m,n}+ — 소유적 버전. 역추적 점 없이 가능한 한 많이 일치.
  • \ — 특수 문자를 이스케이프하거나 특수 시퀀스(예: \d, \w, \s)를 도입.
  • [] — 문자 클래스. [a-z] 같이 범위를 지원.
  • | — A 또는 B.
  • (...) — 그룹. (?P<id>) 로 명명된 그룹, (?:...) 로 비캡처 그룹.

모듈 함수 (Module functions)

  • re.compile(pattern, flags=0) — 패턴 문자열을 컴파일된 정규 표현식 객체로 컴파일해요. 컴파일된 객체는 반복 사용 시 함수보다 효율적이에요.
  • re.search(pattern, string, flags=0) — 문자열에서 패턴과 일치하는 첫 번째 위치를 찾아 Match 객체를 반환해요. 없으면 None.
  • re.match(pattern, string, flags=0) — 문자열의 시작에서 패턴이 일치하면 Match 객체를 반환해요.
  • re.fullmatch(pattern, string, flags=0) — 전체 문자열이 패턴과 일치하면 Match 객체를 반환해요.
  • re.split(pattern, string, maxsplit=0, flags=0) — 패턴이 나타나는 곳에서 문자열을 분할해요.
  • re.findall(pattern, string, flags=0) — 문자열에서 패턴이 겹치지 않는 모든 일치를 문자열 리스트로 반환해요.
  • re.finditer(pattern, string, flags=0) — 문자열에서 패턴의 모든 일치에 대한 이터레이터를 반환해요.
  • re.sub(pattern, repl, string, count=0, flags=0) — 문자열에서 겹치지 않는 패턴 일치를 repl 로 치환해요.
  • re.subn(pattern, repl, string, count=0, flags=0)sub() 와 같지만 (새_문자열, 치환_횟수) 튜플을 반환해요.
  • re.escape(pattern) — 패턴에서 모든 특수 문자를 이스케이프해요.
  • re.purge() — 정규 표현식 캐시를 지워요.

패턴 객체 (Pattern Objects)

컴파일된 패턴 객체는 search(), match(), split(), findall(), finditer(), sub(), subn() 같은 메서드를 제공해요. 속성으로는 flags(일치 플래그), groups(캡처 그룹 수), groupindex(기호 그룹 이름을 그룹 번호에 매핑하는 딕셔너리), pattern(컴파일된 패턴 문자열)이 있어요. 컴파일된 정규 표현식 객체는 원자적(atomic)으로 간주돼요.

일치 객체 (Match Objects)

일치 객체는 항상 불리언 값 True 를 가져요. match()search() 는 일치가 없으면 None 을 반환하므로, 간단한 if 문으로 일치 여부를 테스트할 수 있어요.

  • Match.expand(template)sub() 메서드가 하듯 template 문자열에 백슬래시 치환을 한 결과를 반환해요. \1, \2 같은 숫자 역참조와 \g<1>, \g<name> 같은 명명 역참조가 해당 그룹 내용으로 치환돼요. 버전 3.5부터 일치하지 않은 그룹은 빈 문자열로 치환돼요.
  • Match.group([group1, ...]) — 일치의 하나 이상의 하위 그룹을 반환해요. 인자가 없으면 group1 이 0(전체 일치)으로 기본값이 정해져요. 그룹 번호가 음수이거나 패턴에 정의된 그룹 수보다 크면 IndexError.
  • Match.groups(default=None) — 일치의 모든 그룹을 튜플로 반환해요.
  • Match.groupdict(default=None) — 명명된 그룹을 딕셔너리로 반환해요.

더 알아보기 (Learn more)