정규 표현식(regular expression)
- 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어
- regexp, regex
정규 표현식 메타 문자(meta characters)
- 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자
. ^ $ * + ? { } [ ] \ | ( )
문자 클래스(character class) [ ]
- [ ] 사이의 문자들과 매치
ex) [abc] = a, b, c 중에 한 개의 문자와 매치
- 문자 사이에 하이픈(-)을 사용하면 두 문자 사이의 범위가 된다.
ex) [a-c] = [abc], [0-5] = [012345]
- [a-zA-Z] 알파벳 전부
- [0-9] 숫자
^ 메타 문자
- not 의미를 갖는다.
ex) [^0-9] = 숫자가 아닌 문자
자주 사용하는 문자 클래스
메타 문자 | 매치 | 같은 의미 |
\d | 숫자 | [0-9] |
\D | 숫자가 아닌 것 | [^0-9] |
\s | whitespace 문자 | [ \t\n\r\f\v] |
\S | whitespace 문자가 아닌 것 | [^ \t\n\r\f\v] |
\w | 문자+숫자 | [a-zA-Z0-9_] |
\W | 문자+숫자 | [^a-zA-Z0-9_] |
Dot(.) 메타문자
- \n 을 제외한 모든 문자와 매치
ex) a.b = a + 모든문자 + b
- aab, a0b는 정규식과 매치된다.
문자열을 앞이나 뒤에 매치할 때
- 맨 앞 : ^
ex) ^foo = foo + 아무거나
- 맨 뒤 : $
- 문자열이 $ 앞에 있는 문자로 끝나면 매치된다.
ex) abc$ = 아무거나 + abc
기호 | 의미 |
| | or |
[] | [abc] = a, b, c 중에 하나를 포함 |
[^문자] | [^ab] = a, b 제외 |
^문자열 | ^abc = abc로 시작 |
문자열$ | abc$ = abc로 끝남 |
반복 (*)
- 반복을 의미하는 메타 문자
- *은 *앞에 있는 문자가 무한대로 반복될 수 있다.
반복 (+)
- 최소 1번 이상 반복될 떄 사용한다.
정규식 | 문자열 | 매치 |
ca+t | ct | X |
ca+t | cat | O |
반복 ({m, n}, ?)
- 반복 횟수를 제한할 때 사용
- m부터 n까지
ex) {3,} = 반복 횟수 3 이상
ex) {,3} = 반복 횟수 3 이하
? 메타 문자
- {0, 1} 을 의미한다.
정규 표현식을 지원하는 re 모듈
import re
p = re.compile('abc')
컴파일된 패턴 객체가 제공하는 메서드
method | 목적 |
match() | 문자열의 처음부터 정규식과 매치되는지 조사한다. |
search() | 문자열 전체를 검색해서 정규식과 매치되는지 조사한다. |
findall() | 정규식과 매치되는 모든 문자열(substring)을 리스트로 리턴한다. |
finditer() | 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 리턴한다. |
match
- 문자열의 처음부터 정규식과 매치되는지 조사한다.
- 처음부터 끝까지 전부 일치해야 하는경우 -> fullmatch 사용
# 패턴 만들기
import re
p = re.compile('[a-z]+')
# match 매치 확인
m = p.match('3 python')
print(m) # None : 3이 [a-z]+ 에 매치 되지 않는다
# search
m = p.match('3 python')
print(m) # <re.Match object; span=(2, 8), match='python'>
# search는 문자열을 전체를 검색하기 때문에 매치된다.
findall
result = p.findall("life is too short")
print(result)
# ['life', 'is', 'too', 'short']
# [a-z]+ 와 매치되는 모든 값을 리스트로 리턴
finditer
result = p.finditer("life is too short")
print(result)
<callable_iterator object at 0x01F5E390>
for r in result: print(r)
...
<re.Match object; span=(0, 4), match='life'>
<re.Match object; span=(5, 7), match='is'>
<re.Match object; span=(8, 11), match='too'>
<re.Match object; span=(12, 17), match='short'>
match 객체의 메서드
method | 목적 |
group() | 매치된 문자열을 리턴한다. |
start() | 매치된 문자열의 시작 위치를 리턴한다. |
end() | 매치된 문자열의 끝 위치를 리턴한다. |
span() | 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 리턴한다. |
m = p.match("python")
m.group() # 'python'
m.start() # 0
m.end() # 6
m.span() # (0, 6)
문제 풀이
https://hhiyeon.tistory.com/245
https://hhiyeon.tistory.com/246
https://hhiyeon.tistory.com/247
https://hhiyeon.tistory.com/248
https://hhiyeon.tistory.com/249
https://hhiyeon.tistory.com/250
https://hhiyeon.tistory.com/251
'CS > 자료구조&알고리즘' 카테고리의 다른 글
[최소신장트리] 크루스칼 알고리즘 (1) | 2023.09.28 |
---|---|
[알고리즘] 비트마스크(bitmask) (0) | 2022.09.20 |
[알고리즘] 다익스트라(Dijkstra) 알고리즘 - 최단 거리 (0) | 2022.09.19 |
[알고리즘] 플로이드 와샬(Floyd Warshall) - 모든 정점의 최소 비용 (0) | 2022.09.19 |
[알고리즘] 위상 정렬(Topological Sort) - 줄 세우기, 선수 과목 (3) | 2022.09.19 |