정규 표현식(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
[백준] 1264번 모음의 개수
https://www.acmicpc.net/problem/1264 1264번: 모음의 개수 입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 영어 대소문자, ',', '.', '!', '?', 공백으로 이루어진 문장이 주어진다. 각 줄은 최대
hhiyeon.tistory.com
https://hhiyeon.tistory.com/246
[백준] 23627번 driip
https://www.acmicpc.net/problem/23627 23627번: driip 드립이가 생각하기에 주어진 문자열이 귀여우면 "cute", 그렇지 않으면 "not cute"를 출력한다. (따옴표 제외) www.acmicpc.net 백준 풀이 - driip 으로 끝나는 문자
hhiyeon.tistory.com
https://hhiyeon.tistory.com/247
[백준] 23303번 이 문제는 D2 입니다.
https://www.acmicpc.net/problem/23303 23303번: 이 문제는 D2 입니다. 문자열 안에 $D2$나 $d2$가 들어있다면 D2를 출력한다. 두 글자는 반드시 붙어있어야 하며, $D$/$d$와 $2$ 사이에 공백이 있어도 안 된다. 만약
hhiyeon.tistory.com
https://hhiyeon.tistory.com/248
[백준] 17413번 단어 뒤집기2
https://www.acmicpc.net/problem/17413 17413번: 단어 뒤집기 2 문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('
hhiyeon.tistory.com
https://hhiyeon.tistory.com/249
[백준] 15904번 UCPC는 무엇의 약자일까?
https://www.acmicpc.net/problem/15904 15904번: UCPC는 무엇의 약자일까? 첫 번째 줄에 알파벳 대소문자, 공백으로 구성된 문자열이 주어진다. 문자열의 길이는 최대 1,000자이다. 문자열의 맨 앞과 맨 끝에 공
hhiyeon.tistory.com
https://hhiyeon.tistory.com/250
[백준] 1543번 문서검색
https://www.acmicpc.net/problem/1543 1543번: 문서 검색 세준이는 영어로만 이루어진 어떤 문서를 검색하는 함수를 만들려고 한다. 이 함수는 어떤 단어가 총 몇 번 등장하는지 세려고 한다. 그러나, 세준
hhiyeon.tistory.com
https://hhiyeon.tistory.com/251
[백준] 9996번 한국이 그리울땐 서버에 접속하지
https://www.acmicpc.net/problem/9996 9996번: 한국이 그리울 땐 서버에 접속하지 총 N개의 줄에 걸쳐서, 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 참고로,
hhiyeon.tistory.com
'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 |