본문 바로가기
Application/Python

[Python] 정규식 사용하기 (re)

by wrynn 2022. 8. 23.

소개

  • Python의 re 모듈으로 정규식을 사용할 수 있다. 

단순한 패턴

문자 일치

  • 대부분의 글자나 문자는 자신과 일치한다.
  • 단, 일부 문자는 특수한 메타 문자이며 자신과 일치하지 않는다. 아래는 메타 문자 전체 목록이다.
. ^ $ * + ? { } [ ] \ | ( )

주요 메타 문자

  • [] (문자 클래스)
    • 일치시키려는 문자 집합인 문자 클래스를 나타내는데 사용한다. 
    • 문자를 개별적으로 나열하거나, - 기호로 문자의 범위를 나타낼 수 있다.
    • 클래스 내부에서는 메타 문자가 동작하지 않고 자신과 일치하는 특수 기호를 그대로 표현한다. (\ 제외)
    • 클래스의 맨 앞에 ^ (Caret) 기호를 사용하여 해당 문자 클래스의 여집합을 나타낼 수 있다. ex) [^5] 
      맨 앞이 아닌 ^ 기호는 단순히 ^ 기호와 일치하는지를 판단하는데 사용한다. ex) [5^]
  • \ (백슬래시)
    • 백 슬래시 다음에 다양한 특수 시퀀스를 알리는 다양한 문자가 따라올 수 있다.
    • 모든 메타 문자를 이스케이프 처리하여 패턴으로 일치시킬 수 있도록 만들 수 있다. ex) \[, \\ 등
    • 아래와 같은 백슬래시 시퀀스는 문자 클래스 내에서도 사용이 가능하다.
    • \d : 모든 숫자. [0-9] 와 동일
    • \D : 모든 비숫자. [^0-9] 와 동일
    • \s : 모든 공백 문자. [ \t\n\r\f\v] 와 동일
    • \S : 모든 비공백 문자. [^ \t\n\r\f\v] 와 동일
    • \w : 모든 영문 및 숫자 (_기호 포함). [a-zA-Z0-9_] 와 동일
    • \W : 모든 비영문 및 숫자. [^a-zA-Z0-9_] 와 동일
  • *, +, ?, {n, m} (반복)
    • * : 0번 이상 반복 {0, }
    • + : 1번 이상 반복 {1, }
    • ? : 0번 혹은 1번 반복 {0, 1}
    • {n, m} : n번 이상 m번 이하 반복 

기타 메타 문자

  • | (or 연산자)
    • A|B 는 패턴 A 혹은 패턴 B와 일치하는 경우
  • ^
    • 주어진 문자열의 시작하는 부분과 정규식 패턴이 일치하는지검사
    • 문자 클래스 내부가 아님에 유의한다.
  • $
    • 주어진 문자열이 나는 부분과 정규식 패턴이 일치하는지검사
    •  

정규식 사용하기

정규식 컴파일

  • 컴파일을 통해 문자열로 된 정규식 패턴을 정규식 객체로 다룰 수 있다.
>>> import re
>>> p = re.compile('ab*')
>>> p
re.compile('ab*')
  • 컴파일된 정규식 객체는 search, match 등의 정규식 관련 함수를 사용할 수 있다.
  • 정규식이 단일 프로그램에서 여러 번 사용될 때 compile을 하여 재사용하는 것이 더 효율적이다.
    (단, 가장 최근 패턴의 컴파일된 버전이 캐시 되므로, 한 번에 몇 가지 정규식만 사용하는 프로그램은 정규식 컴파일에 대해 신경 쓸 필요가 없다. 반복문 안에서 쓸 때는 컴파일하자.)
prog = re.compile(pattern)
result = prog.match(string)
  • 정규식 객체를 사용하는 대신 문자열로 된 정규식 패턴을 함수 인자에 추가로 전달하여 사용할 수 있다.
    (모듈 레벨 함수, 이 경우 내부적으로 컴파일된 후 동작한다.)
  • 위 식은 다음과 동일하다.
result = re.match(pattern, string)
  • 문자열 정규식 패턴을 작성하는 경우 퍼져나가는 백슬래시에 유의해야 한다. 
    예를 들어, '\section' 과 일치하는 문자열을 찾을 경우 re.compile의 인자로 전달되는 정규식 패턴은 '\\section' 이다. (\는 메타 문자이므로) 이 정규식 패턴을 다시 파이썬 문자열로 나타내려면 '\\\\section' 으로 나타내야 한다. (\\는 파이썬 문자열에서 백슬래시 하나를 표현)
  • 이를 해결하기 위해 raw string notation을 사용할 수 있다. 문자열 앞에 r을 붙여 사용한다.
  • 사용 예시
>>> import re
>>> text = "\\\\section without s is ection"		# 파이썬 문자열 \\\\section without s is ection
>>> print(text) 	 			# 실제 문자열 \\section without s is ection
\\section without s is ection
>>> a = re.sub("\\section", "REPLACED", text)   
                                # 파이썬 문자열 \\section -> 정규식 \section ->
                                # 정규식에서 \s는 모든 공백을 나타내는 메타 문자 ->
                                # 공백에 이어 ection이 나타나는 문자열을 "REPLACED"로 치환 
>>> a
'\\\\section without s isREPLACED'
>>> a = re.sub(r"\\section", "REPLACED", text)
				# raw string \\section -> 정규식 \\section ->
                                # 실제 문자열에서 "\section"을 "REPLACED"로 치환 
                                # 파이썬 문자열에서 "\section"을 치환하여 \\\REPLACED~ 가 아님에 유의
>>> a
'\\REPLACED without s is ection'
>>> a = re.sub("\\\\section", "REPLACED", text)   
                                # 문자열 \\\\section -> 정규식 \\section
>>> a
'\\REPLACED without s is ection'
>>> a = re.sub(r"\\\\section", "REPLACED", text)
								# raw string \\\\section -> 정규식 \\\\section
>>> a
'REPLACED without s is ection'

탐색

  • match(string) : 주어진 string이 정규식 패턴으로 시작하는지 확인. 일치하면 Match 객체를 아니면 None을 반환
  • search(string) : 주어진 string이 정규식 패턴을 포함하고 있는지 확인. 일치하면 처음 나타나는 위치의 Match 객체를 아니면 None을 반환 
  • findall(string) : search와 유사하나 RE가 일치하는 모든 부분 문자열을 찾아 리스트로 반환
  • finditer(string) : findall과 유사하나 문자열 대신 이터레이터로 반환

분할

  • split() : 정규식이 일치하는 모든 곳에서 문자열을 리스트로 분할하여 반환한다.

치환

  • sub(replacement, string) : string에서 정규식 패턴과 일치하는 부분을 replacement로 대체한다.
  • subn(replacement, string) : sub과 동일하나 바뀐 횟수를 같이 반환한다. 

레퍼런스

 

re — 정규식 연산 — Python 3.10.7 문서

re — 정규식 연산 소스 코드: Lib/re.py 이 모듈은 Perl에 있는 것과 유사한 정규식 일치 연산을 제공합니다. 패턴과 검색 할 문자열은 모두 유니코드 문자열(str)과 8비트 문자열(bytes)이 될 수 있습니

docs.python.org

 

정규식 HOWTO — Python 3.10.7 문서

대소 문자를 구분하지 않는 일치를 수행합니다; 문자 클래스와 리터럴 문자열은 대소 문자를 무시하여 문자와 일치합니다. 예를 들어 [A-Z]는 소문자와도 일치합니다. ASCII 플래그로 ASCII가 아닌

docs.python.org

 

댓글