정규표현식
정규표현식
정규표현식이란 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다.
메타 문자
정규표현식에서 특정 문자들은 기존의 의미와 다른 특별한 의미를 갖게 된다.
주로 사용되는 메타문자 목록은 다음과 같다.
- $
- *
- +
- { }
- [ ]
- \
-
- ()
- ?
- .
[ ] 문자 클래스
- [] 사이의 문자들과 매치를 의미한다.
- 표현식이 [abc] 일 때 a,b,c 중 하나의 알파벳이라도 문자열에 포함되어 있다면 매칭된다.
- 하이픈을 이용하여 범위를 지정할 수 있다.
- [abc] 는 [a-c]와 같다.
- [a-zA-Z] = 알파벳 모두, [0-9] = 모든 숫자 를 의미한다.
- 문자 클래스 안에 ^를 사용할 경우 반대를 의미한다.
- [^0-9] 는 숫자가 아닌 문자를 의미한다.
- 자주 사용하는 문자 클래스
- \d : [0-9] 와 동일
- \D : [ ^ 0-9] 와 동일
- \s : whitespace 문자와 매치 [ \t\n\r\f\v] 와 동일
- \S : \s와 반대
- \w : 문자 +숫자와 매치 [a-zA-Z0-9_] 와 동일
- \W : \w 와 반대
- [ㄱ-힣] : 모든 한글을 의미한다
Dot
- 줄바꿈 문자를 제외한 모든 문자와 매칭된다.
- a.b 이라는 정규식을 사용할 경우 a + 모든문자 + b 를 의미한다.
- 즉 ab 사이에 줄바꿈문자외에 어떤문자라도 존재한다면 매칭된다.
반복 (*)
-
0번부터 무한대로 반복될 수 있음을 의미한다.
- do*g 일 경우 doooog dog dg 모두 매칭된다.
반복(+)
- 1번부터 무한대로 반복될 수 있음을 의미한다.
- do*g 일 경우 doooog dog dg 에서 1번도 o가 반복되지 않는 dg를 빼고 모두 매칭된다.
반복 {m,n}
- 반복횟수를 지정 가능하다.
- do{2}g 일 경우 doog 와 매칭된다.
- do{2,5}g 일 경우 doog, dooog doooog dooooog 까지 매칭된다.
?
- {0,1} 과 같다.
- 있어도 되고 없어도 된다를 의미함.
- do?g 일 경우 dog , dg 모두 매칭 된다.
python 에서의 정규표현식
파이썬에서는 정규표현식을 사용하기 위해 re모듈을 기본 라이브러리로 제공한다.
re.complie
re.compile 함수를 사용하여 정규식을 컴파일하여 객체를 반환한다.
해당 객체를 통해 문자열 검색이 가능하다.
import re
p= re.compile('[a-z]+') #모든 소문자 알파벳이 한 번 이상 반복될 수 있음을 의미
match
매치 함수를 통해 정규식과 매칭 여부를 알 수있다.
m = p.match('yoonjungho')
print(m)
<re.Match object; span=(0, 10), match='yoonjungho'>
m = p.match('yoon7jungho')
print(m)
<re.Match object; span=(0, 4), match='yoon'>
m = p.match('7 yoonjungho')
print(m)
None
보이는 것과 같이 매칭여부를 반환해준다.
match 인스턴스 함수
- group() : 매칭된 문자열을 반환
- start() : 매칭된 문자열의 시작 위치를 반환
- end() : 매칭된 문자열의 끝 위치를 반환
- span() : 매칭된 문자열의 시작과 끝에 해당하느 튜플을 반환
import re
p= re.compile('[a-z]+')
m = p.match('yoon7jungho')
print(m)
print(m.group())
print(m.start())
print(m.end())
print(m.span())
<re.Match object; span=(0, 4), match='yoon'>
yoon
0
4
(0, 4)
그룹함수는 매칭 결과를 좀 더 보기좋게 식별하기 위해 사용된다.
import re
p= re.compile('[a-z]+')
m = p.match('yoon7jungho')
if m:
print('Match found: ', m.group())
else:
print('No match')
Match found: yoon
search
match 와 다르게 해당 문자열의 첫번째부터가 아닌 전체를 검색한다.
import re
p= re.compile('[a-z]+')
m = p.search('7 yoon7jungho')
print(m)
<re.Match object; span=(2, 6), match='yoon'>
findall
매칭되는 문자열을 리스트의 형태로 반환한다.
import re
p= re.compile('[a-z]+')
m = p.findall('jungho is awesome')
print(m)
['jungho', 'is', 'awesome']
finditer
반복가능한 이터레이터 객체 형식으로 결과를 반환한다.
import re
p= re.compile('[a-z]+')
m = p.finditer('jungho is awesome')
for x in m :
print(x)
<re.Match object; span=(0, 6), match='jungho'>
<re.Match object; span=(7, 9), match='is'>
<re.Match object; span=(10, 17), match='awesome'>
번외, 좋은 블로그 정리글
티스토리 하마님 블로그 https://hamait.tistory.com/342
댓글남기기