[Python] 정규 표현식

Chris Kim·2024년 11월 8일

프로그래밍언어

목록 보기
22/25

1. Basic

1.1 문자클래스 []

[] 사이에 있는 글자 중 하나와 매치하는지를 나타낸다. 두 문자 사이에 -을 사용하면 두 문자 사이의 범위를 의미한다. [] 안에는 어떤 메타 문자도 들어갈 수 있으나, ^는 반대를 의미하므로 주의하자.

정규 표현식Description
\d숫자와 매치
\D숫자가 아닌 것과 매치
\s공백 문자와 매치
\S공백 문자가 아닌 것과 매치
\w문자 + 숫자와 매치
\W문자 + 숫자 가 아닌 것과 매치

1.2 Dot(.)

.는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다.
a.b에서 abc는 매치가 이뤄지지만 acd는 매치가 되지 않는다. 정규표현식이 아닌 문자열 a.b과 매치하기 위해서는 정규표현식을 a[.]b로 작성해야한다.

1.3 반복(*)

*은 바로 앞에 있는 문자가 0부터 무한대로 반복될 수 있음을 말한다.

1.4 반복(+)

+는 바로 앞에 있는 문자가 최소 1번 이상 반복될 수 있음을 말한다.

1.5 반복({m,n}, ?)

{m,n}은 m번 이상, n번 이하 반복을 의미한다. ?{0,1}을 의미한다.

2. re 모듈

파이썬에서는 정규표현식을 지원하는 re(regular expression) 모듈이 있다. 사용법은 다음과 같다.

import re
p = re.compile('ab*")

2.1 문자열 검색

MethodPurpose
match()문자열의 처음부터 정규식과 매치되는지 조사
search()문자열 전체를 검색하여 정규식과 매치되는지 조사
findall()정규식과 매치되는 모든 문자열을 리스트로 반환
finditer()정규식과 매치되는 모든 문자열을 반복 가능한 객체로 반환

2.2 match 객체

match, search, finditer 등은 match 객체를 반환한다. match 객체의 메서드는 다음과 같다.

MethodPurpose
group()매치된 문자열 반환
start()매치된 문자열의 시작 위치 반환
end()매치된 문자열의 끝 위치 반환
span()매치된 문자열의(시작, 끝)에 해당하는 튜플 반환

[Tip] 다음과 같이 모듈 단위로 수행할 수 있다.
m = re.match('[a-z]+', "test")

2.3 컴파일 옵션

옵션 이름약어설명
DOTALLSdot 문자가 줄바꿈 문자를 포함하여 모든 문자와 매치
IGNORECASEI대/소문자 관계 없이 매치
MULTILINEM여러 줄과 매치
VERBOSEXverbose 모드 사용

3. Additional

3.1 메타문자

메타 문자설명
|or와 동일한 의미로 사용된다.
^문자열의 맨 처음과 일치함을 의미한다.
$^와 반대로, 문자열의 끝과 일치함을 의미한다.
\A'전체' 문자열의 처음과 일치
\Z'전체' 문자열의 끝과 일치
\b단어 구분자를 의미한다. 사용시 r(Raw String)을 사용해야한다.
\B\b와 반대의 경우를 의미한다.

3.2 그루핑(Grouping)

()를 사용해서 계속해서 반복되는지 조사할 수 있다.

p = re.compile('(ABC)+')
m = p.search('ABCABCABC OK?')
print(m)
print(m.group(1))

group(n)은 n 번째 그룹에 해당하는 문자열을 의미한다. 0이 들어가는 매치된 전체 문자열을 의미한다. 그루핑을 중첩해서 사용하는 경우 인덱스는 바깥에서 안쪽 방향으로 증가한다. \1, \2 등을 통해 한 번 그루핑한 문자열을 재참조(Backreferences) 할 수 있다.

3.3 그루핑된 문자열에 이름 붙이기

그룹에 이름을 다음과 같이 붙여 줄 수 있다.

(?P<group name>...)

그룹 이름을 통해 재참조도 가능하다. 재참조 할 때에는 확장 구문을 사용해야한다.

3.4 전방 탐색(Lookahead Assertions)

정규식종류설명
(?=...)긍정형 전방 탐색...에 해당하는 정규식과 매치되어야 하며 조건이 통과되어도 문자열이 소비되지 않는다.
(?!...)부정형 전방 탐색...에 해당하는 정규식과 매치되지 않아야 하며 조건이 통과되어도 문자열이 소비되지 않는다.

3.5 문자열 바꾸기

p = re.compile('(blue|white|red)')
p.sub('colour', 'blue socks white socks red socks')

count 값을 매개변수로 넘기면 바꾸는 횟수를 제한할 수 있다. subn 메소드는 sub와 동일한 기능을 하지만, 변환된 문자열과 변환 횟수를 튜플 형태로 반환한다.
\g<group name or index>를 통해 정규식 그룹을 참조할 수 있다.
sub의 첫 번째 매개변수로 함수를 사용할 경우 , 해당 함수의 첫 번째 매개변수에는 정규식과 매치된 match 객체가 입력된다.

3.6 Greedy vs Non-Greedy

'<.*>'는 <html>, <body> 등을 소비할 것이다. 문제는 하나만 소비하는게 아니라 주어진 문자열에 있는 모든 것을 소비한다는 것이다.
이 문제를 위해 '<.*?>', 즉 ?을 사용하여 최소한의 반복을 수행하도록 만들 수 있다.

profile
회계+IT=???

0개의 댓글