소개
- 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과 동일하나 바뀐 횟수를 같이 반환한다.
레퍼런스
댓글