티스토리 뷰
정규식 HOWTO docs & re 라이브러리 docs
re : 파이썬에서 정규식을 사용하기 위한 모듈
import re
메타문자
메타 문자 목록은 다음과 같다.
. ^ $ * + ? { } [ ] \ | ( )
문자 일치
1. [ ]
일치시키려는 문자 집합인 문자 클래스를 지정하는 데 사용한다.
문자는 개별적으로 나열되거나, 두 문자를 주고 '-'로 구분하여 문자의 범위를 나타낼 수 있다.
[abcde] = [a-e] : 'a', 'b', 'c', 'd', 'e'
클래스 내에서는 메타문자의 특수성이 사라진다.
[a-c+^] : 'a', 'b', 'c', '+', '^'
^를 클래스의 첫 번째 문자로 포함시켜 클래스 내에 나열된 문자들의 여집합을 정의할 수 있다.
[^5] : '5'를 제외한 모든 문자ㅇ
[5^] : '5', '^'
2. \
(1) 메타 문자의 특수성을 제거하여 문자 그대로 처리해주는 이스케이프 문자로 사용할 수 있다.
메타 문자인 ^나 \와 일치시켜야 할때 \^, \\와 같이 사용한다.
(2) 다양한 특수 시퀀스를 만들어 숫자 집합, 글자 집합 등 미리 정의된 문자 집합을 사용할 수 있다.
\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_]
시퀀스들은 문자 클래스 내에 포함될 수 있다.
[\s,.] : 모든 공백 문자, ',' 또는 '.'와 일치.
3. .
모든 문자와 일치시킬 때 사용할 수 있다.
.는 개행 문자를 제외한 모든 문자와 일치한다.
반복하기
1. *
이전 문자를 0번 이상 일치시킬 수 있도록 지정한다.
ca*t : 'ct', 'cat', 'caaat' 등과 일치
a[bcd]*b : 'a'로 시작하고, 0개 이상의 [bcd] 클래스 문자가 뒤따르고, 'b'로 끝나는 문자열과 일치
2. +
이전 문자를 1번 이상 일치시킬 수 있도록 지정한다.
ca+t : 'cat', 'caaat'와 일치하지만 'ct'와는 불일치
3. ?
반복 한정자로 사용하여, 이전 문자를 0번 또는 1번 일치시킬 수 있도록 지정한다.
ca?t : 'ct', 'cat' 와 일치
4. { }
{m, n} 형태의 반복 한정자로 사용하여, 최소m번~최대n번까지 일치시킬 수 있도록 지정한다.
a/{1,3}b : 'a/b', 'a//b', 'a///b'와 일치
그룹
1. ( )
내부에 포함된 표현식을 함께 묶고, *, +, ? 또는 {m,n}과 같은 반복 한정자로 그룹의 내용을 반복할 수 있다.
(ab)* : 'ab', 'ababab' ab를 0번 이상 반복한 것에 일치
매치된 문자열 중에서 특정 부분의 문자열을 뽑아내고 싶을 때도 사용할 수 있다.
# 이름 부분 그룹핑, 전화번호 부분 그룹핑
p = re.compile(r"(\w+)\s+(\d+[-]\d+[-]\d+)")
m = p.search("park 010-1234-1234")
print(m.group(1))
>> park
print(m.group(2))
>> 010-1234-1234
string = '1D*2S#10S'
# 그룹핑 안함
result = re.findall('\d+[SDT][*#]?', string)
print(result)
>> ['1D*', '2S#', '10S']
# 그룹핑 함
result = re.findall('(\d+)([SDT])([*#]?)', string)
print(result)
>> [('1', 'D', '*'), ('2', 'S', '#'), ('10', 'S', '')]
그 외
1. |
A와 B가 정규식이면, A|B는 A나 B와 일치하는 문자열과 일치한다.
abc|xyz : 'abc'나 'xyz'와 일치 ('a', 'bc', 'xy' 등 X)
2. ^
줄의 시작 부분과 일치한다. (문자 클래스 내에서 여집합을 정의하는 것과 다름을 주의)
^0 : '0'으로 시작하는 문자열과 일치^\^ : : '^'으로 시작하는 문자열과 일치
3. $
줄의 끝 부분과 일치한다.
0$ : '0'으로 끝나는 문자열과 일치
\}$ : '}'으로 끝나는 문자열과 일치
정규식 컴파일하기
같은 정규식을 여러 번 사용한다면, 정규식을 컴파일하여 정규식 객체를 저장해 사용하는 것이 효율적이다.
re.compile(pattern, flags=0)
p = re.compile('ab*')
다음 두 가지는 같은 역할을 한다.
# 정규식 패턴을 사용
result = re.match(pattern, string)
# 컴파일한 정규식 객체를 사용
p = re.compile(pattern)
result = p.match(string)
RE는 문자열로 re.compile()에 전달된다.
RE를 문자열에 넣는 것은 파이썬 언어를 더 간단하게 해주지만, 한 가지 단점이 있다.
백슬래시 전염병
정규식은 \를 이스케이프 문자로 사용하는데, 이것은 파이썬이 문자열 리터럴에서 같은 목적으로 같은 문자를 사용하는 것과 충돌한다.
문자열 '\section'과 일치하는 re를 작성한다고 생각해보자.
\section | 일치시킬 문자열 |
\\section | re.compile()에 전달하기 위해 \를 이스케이프 처리 |
"\\\\section" | 문자열 리터럴을 위해 \를 이스케이프 처리 |
즉, 정규식은 \\이어야 하고, 일반 파이썬 문자열 리터럴 안에서 각 \는 \\로 표현해야 하기때문에, RE 문자열로 \\\\를 작성해야 한다.
백 슬래시를 반복적으로 사용하는 RE에서는 수없이 반복되는 백 슬래시로 이어지게 된다.
정규식에 파이썬의 날 문자열 표기법을 사용하여 해결한다.
\는 'r' 접두사가 붙은 문자열 리터럴에서 특수성이 제거된다.
r"\n" : '\'과 'n'을 포함하는 두 문자 문자열
"\n" : 줄바꿈이라는 한 문자 문자열
일반 문자열 | 날 문자열 |
"ab*" | r"ab*" |
"\\\\section" | r"\\section" |
"\\w+\\s+\\1" | r"\w+\s+\1" |
일치 수행하기
이제 컴파일한 정규식 객체 또는 정규식 문자열을 패턴으로 하여 여러 가지 메서드를 사용할 수 있다.
컴파일한 정규식 객체의 메서드
re — 정규식 연산 — Python 3.9.5 문서
scanf() 시뮬레이션 파이썬에는 현재 scanf()에 해당하는 것이 없습니다. 정규식은 일반적으로 scanf() 포맷 문자열보다 강력하지만, 더 장황하기도 합니다. 아래 표는 scanf() 포맷 토큰과 정규식 간의
docs.python.org
모듈 수준 메서드
re — 정규식 연산 — Python 3.9.5 문서
scanf() 시뮬레이션 파이썬에는 현재 scanf()에 해당하는 것이 없습니다. 정규식은 일반적으로 scanf() 포맷 문자열보다 강력하지만, 더 장황하기도 합니다. 아래 표는 scanf() 포맷 토큰과 정규식 간의
docs.python.org
컴파일 플래그
정규식 HOWTO — Python 3.9.5 문서
소개 정규식(RE, regexes 또는 regex 패턴이라고 불립니다)은 본질적으로 파이썬에 내장된 매우 작고 고도로 특수화된 프로그래밍 언어이며, re 모듈을 통해 사용할 수 있습니다. 이 작은 언어를 사용
docs.python.org
'알고리즘공부' 카테고리의 다른 글
[Python] rjust, ljust, zfill (0) | 2021.05.12 |
---|---|
[Python] zip (0) | 2021.05.09 |
[Python] lambda (0) | 2021.05.09 |
[수학] 소수 판별하기, 모든 소수 구하기 (0) | 2021.05.07 |
[수학] 약수 구하기 (0) | 2021.05.06 |