정규 표현식(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

 

+ Recent posts