티스토리 뷰

알고리즘공부

[Python] re

eedada 2021. 5. 19. 22:43
정규식 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
댓글