정규 표현식(Regular Expressions)은 복잡한 문자열을 처리할 때 사용하는 기법으로, 파이썬만의 고유 문법이 아니라 문자열을 처리하는 모든 곳에서 사용한다. 정규 표현식을 배우는 것은 파이썬을 배우는 것과는 또 다른 영역의 과제이다.
※ 정규 표현식은 줄여서 간단히 "정규식"이라고도 말한다.
✏️ 메타 문자란 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자를 말한다.
. ^ $ * + ? { } [ ] \ | ( )
✏️ 문자 클래스를 만드는 메타 문자 [] 사이에는 어떤 문자도 들어갈수 있다.
문자 집합인 문자 클래스를 지정하는 데 사용됩니다. 문자는 개별적으로 나열되거나 두 문자를 두고-
로 구분하여 문자의 범위를 표현한다.
ex)[abc]
=[a-c]
❗️ 메타 문자는 클래스 내부에서는 활성화 되지 않습니다
[akm$]
는'a'
'k'
'm'
'$'
문자와 일치하게 기능하며,'$'
대게 매타문자이지만 문자 클라스 안에서는 특수한 특성이 없어진다.
^
메타 문자는 문자열의 맨 처음과 일치함을 의미한다.
ex)'^Life'
는 비교하는 정규식은Life
문자열이 처음에 왔는지 매치 여부를 알려준다.>> print(re.search('^Life', 'Life is too short')) <re.Match object; span=(0, 4), match='Life'> >> print(re.search('^Life', 'My Life')) None
❗️ 문자 클래스([]) 안에서 사용되는
^
은 반대not)라는 의미를 갖는다
ex) `[^5]
:'5'
를 제외한 모든 문자 `
$
메타 문자는^
메타 문자와 반대의 경우이다. 즉$
는 문자열의 끝과 매치함을 의미한다.
|
메타문자는 or과 동일한 의미로 사용된다.A|B
라는 정규식이 있다면, A 또는 B라는 의미가 된다.. (마침표)
줄바꿈 문자
\n
을 제외한 모든 문자를 매치를 의미
❗️a[.]b
= 'a + Dot(.) + b'
\
)
'\'
로 시작하는 특수 시퀀스 중 일부는 숫자(digit) 집합, 글자(letter) 집합 또는 종종 유용한 미리 정의된 문자 집합을 나타내기도 한다.
\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_]
메타 캐릭터가 캐릭터 자체를 표현하도록 할 경우
\[
\]
\\
\.
+
)
+
: 1번 이상의 패턴이 발생
*
)
*
: 0번 이상의 패턴의 발생
?
)
?
: 0 혹은 1번의 패턴이 발생 (있거나 없거나)
{m}
: 반드시 m 번 반복
{m,n}
: m~n 번 반복
✏️{1,}
=+
✏️{0,}
=*
search
와 유사하나, 주어진 문자열의 시작부터 비교하여 패턴이 있는지 확인
시작부터 해당 패턴이 존재하지 않는다면 None으로 반환한다
search
가 최초로 매칭되는 패터만 반환한다면,findall
은 매칭되는 전체 패턴을 리스트 형태로 반환
주어진 문자열에서 일치하는 모든 패턴을 replace 그 결과를 문자열로 다시 반환함
두번째 인자는 특정 문자열이 될 수도 있고, 함수가 될 수도 있다.
동일한 정규표현식을 매번 다시 쓰기 번거로움을 해결
compile
로 해당표현식을 re.RegexObject 객체로 저장하여 사용가능
ABC 문자열이 계속해서 반복되는지 조사하는 정규식을 작성하고 싶다고 하자. 이럴 때 필요한 것이 바로
Grouping
이다.ex) (ABC)+
그룹을 만들어 주는 메타 문자는 바로
( )
이다.
아래 예제를 한번보면
grouping
에 대한 이해가 좀 더 수월할것이다.>> import re >> p =re.compile(r'(\w+)\s+(\d+[-]\d+[-]\d+)') >> m = p.search('kim 010-1234-1234') >> print(m.group(0)) kim 010-1234-1234 >> print(m.group(1)) kim >> print(m.group(2)) 010-1234-1234 >> print(m.group(3)) Traceback (most recent call last): File "<stdin>", line 1, in <module IndexError: no such group
만약에, 위에서 group(3)을 추가하고 싶다면
p =re.compile(r'(\w+)\s+((\d+)[-]\d+[-]\d+)')
추가적으로 하나의 ( ) 그룹을 추가해주면 된다.>> p =re.compile(r'(\w+)\s+((\d+)[-]\d+[-]\d+)') >> m = p.search('kim 010-1234-1234') >> print(m.group(3)) 010