Regex (with Python3)
Updated Feb 01, 2024
메타 문자
$()*+.?[]\^{}|
등이 존재하고, 특정 문자 혹은 문자 계열을 대신하여 표현하는 문자이다.
이를 이용하면 특정 규칙을 가진 여러 단어들을 하나의 패턴으로 함축할 수 있다.
(메타 문자에 해당되는 문자 자체를 검색하고 싶은 경우, 백슬래쉬(\
)를 앞에 붙이면 된다.)
^ 문자
[^a] → a 가 아닌 것과 매치를 뜻한다.
그냥 사용할 경우, 문자열의 시작을 표현한다.
$ 문자
문자열의 끝을 표현한다.
[ ] 문자 - 문자 클래스
[ ] 사이에 들어간 문자들과의 매치를 뜻한다.
하이폰 (-)를 사용하여 문자 사이의 범위를 패턴으로 하여 매치할 수 있다.
자주 사용하는 문자 클래스
[0-9]
또는 [a-zA-Z]
등은 무척 자주 사용하는 정규 표현식이다. 이렇게 자주 사용하는 정규식은 별도의 표기법으로 표현할 수 있다. 다음을 기억해 두자.
\d
- 숫자와 매치된다.[0-9]
와 동일한 표현식이다.\D
- 숫자가 아닌 것과 매치된다.[^0-9]
와 동일한 표현식이다.\s
- 화이트스페이스(whitespace) 문자와 매치된다.[ \t\n\r\f\v]
와 동일한 표현식이다. 맨 앞의 빈칸은 공백 문자(space)를 의미한다.\S
- 화이트스페이스 문자가 아닌 것과 매치된다.[^ \t\n\r\f\v]
와 동일한 표현식이다.\w
- 문자+숫자(alphanumeric)와 매치된다.[a-zA-Z0-9_]
와 동일한 표현식이다.\W
- 문자+숫자(alphanumeric)가 아닌 문자와 매치된다.[^a-zA-Z0-9_]
와 동일한 표현식이다.
대문자로 사용된 것은 소문자의 반대임을 추측할 수 있다.
.(dot) 문자 - \n
를 제외한 모든 문자
1
2
a.b - "a'+모든 문자+"b"
a[.]b - "a.b"
위와 같이 사용하고, 혼동하지 않도록 주의해야 한다.
* 문자
- 문자 앞에 나온 문자를 0번 이상 반복되면 매치된다.
1
a*b - "ab", "b", "aaaab" 등과 매치
+ 문자
위의 * 문자와 거의 똑같지만, 앞에 나온 문자가 1번 이상 반복되면 매치된다.
{} 문자와 ? 문자
앞에 나온 문자가 중괄호 안에 들어간 카운트 수 만큼 매치된다.
1
2
a{2} # a 2개
a{2,5} # a 2개 ~ 5개
? 는 {0,1}과 같다.
파이썬
함수
-
match
문자열의 시작부터 패턴과 일치하는지 확인한다.
1 2 3
# re.match(pattern,string,flag) re.match('a','ab') # O re.match('b','ab') # X
-
search
문자열에 패턴과 일치하는 결과가 있는지 확인한다.
1 2 3
# re.search(pattern,string,flag) re.search('a','ab') # O re.search('b','ab') # O
-
findall
문자열에 패턴과 일치하는 결과가 있는지 확인하고, 여러 개일 경우, 모든 결과를 리스트로 반환한다.
1 2 3 4
# re.findall(pattern,string,flag) re.findall('a','a') # ['a'] re.findall('a','aaaaaaa') # ['a', 'a', 'a', 'a', 'a', 'a', 'a'] re.findall('aaa','aaaaaaaaa') # ['aaa', 'aaa', 'aaa']
-
finditer
findall과 비슷하지만, 리스트가 아닌 iterator 형식으로 반환한다.
1 2 3
# re.finditer(pattern,string,flag) re.finditer('a','a') # iterator 객체 re.finditer('a','aaaaaa') # iterator 객체
-
fullmatch
문자열과 패턴이 완벽하게 일치하는지 확인한다.
1 2 3 4
# re.fullmatch(pattern,string,flag) re.fullmatch('a','a') # O re.fullmatch('a','aa') # X re.fullmatch('a','ab') # X
-
split
문자열에서 패턴이 맞으면 이를 기점으로 쪼갠다. (최대 split 수를 설정하면 지정한 수 만큼 쪼개고, 나머지 뒤 문자열을 리스트의 마지막에 추가한다)
1 2 3
# re.split(pattern,string,max split,flag) re.split('a','a') # ['', ''] re.split('a','bab') # ['b', 'b']
-
sub
문자열에 맞는 패턴을 교체할 문자열로 교체한다. (최대 sub 수를 설정하면, 지정한 수 만큼 교체하고, 나머지 뒤 문자열은 그대로 둔다)
1 2 3
# re.sub(pattern,string,max sub,flag) re.sub('a','z','a') # z re.sub('a','zz','ab') # zzb
-
subn
sub와 동작은 비슷하지만, (문자열, 매칭 횟수) 형태로 반환한다.
1 2 3
# re.subn(pattern,string,max sub,flag) re.subn('a','z','a') # ('z',1) re.subn('a','zz','aaab') # ('zzzzzzb', 3)
-
compile
패턴과 플래그가 동일한 정규식을 여러번 사용할 때 쓴다.
1 2 3
# re.compile(pattern,flag) a = re.compile('a') a.search('abab') # O
-
purge
compile로 만든 객체는 보통 100개까지 캐시에 저장하고, 그 수를 넘어가면 초기화 된다.
purge 함수는 100개가 넘어가지 않아도 캐시를 초기화 할 수 있다.
-
escape
패턴을 입력 받으면, 특수문자들에 이스케이프(백슬래쉬) 처리를 한 후, 반환한다.
1 2 3
# re.escape(pattern) re.escape("a") # 'a' re.escape("a{2,3}b") # 'a\\{2,3\\}b'
오브젝트
함수의 반환이 match object로 반환되는 경우, group(), start(), end() 등의 함수를 사용할 수 있다.
-
groups
일치하는 모든 서브 그룹을 포함하는 튜플을 반환한다.
기본 값은 None이다.
-
group
group(0), group(1) 과 깉이 사용할 수 있고, groups 튜플의 index 접근과 비슷하다.
-
groupdict
(?P<group_name>PATTERN)
와 같이 정규표현식을 그룹화하고, 네이밍한 결과를 딕셔너리 형태로 반환 받을 수 있다.1 2
a=re.match("(?P<Test>a*)","aaa") a.groupdict() # {'Test': 'aaa'}
플래그
- DOTALL(S) -
.
(dot)이 줄바꿈 문자를 포함해 모든 문자와 매치될 수 있게 한다. - IGNORECASE(I) - 대소문자에 관계없이 매치될 수 있게 한다.
- MULTILINE(M) - 여러 줄과 매치될 수 있게 한다.
^
,$
메타 문자 사용과 관계 있는 옵션이다. - VERBOSE(X) - verbose 모드를 사용할 수 있게 한다. 정규식을 보기 편하게 만들 수 있고 주석 등을 사용할 수 있게 된다.