정규표현식은 전처리 등의 작업을 위해 복잡한 문자열을 처리할 때 자주 사용된다.
원하는 문자열을 re.compile(조건) 형태로 객체화시킨 후,
이를 사용하여 문자열 검색을 수행할 수 있다.
import re
r = re.compile([a-z]) # 패턴(소문자 a-z)를 가지고 있는 r 객체를 리턴한다.
# match함수는 아래에서 자세히 살펴본다.
m = r.match('aBc3') # 문자열(aBc3)이 소문자로 시작하는 패턴을 갖는가? Y
print(m.group()) # a
math, search 등의 메소드 안에 패턴과 문자열을 모두 집어넣는 방법
import re
str1 = 'aBc3'
m = re.match('[a-z]', str1)
print(m.group()) # a
:원래 그 문자가 가진 뜻이 아닌 특수한 기능을 하는 문자.
compile로 패턴을 만드려면 패턴을 나타내는 메타문자를 알아야 한다.
. * [ ] ^ $ + ? { } \ | ( )
문자 | 기능 | 예시 |
---|---|---|
. | 1개의 문자 | a.b는 a□b 의 형태를 갖는 3자리 단어이다. |
* | 0번 이상 반복 | a*b는 a가 0번 이상 반복되고 b가 오는 단어 b, ab, kaab등 |
+ | 1번 이상 반복 | a+b는 a가 1번 이상 반복되고 b가 오는 단어 ab(0) aab(0) aaaaa(x) akb(x) |
{m,n} | 최소 m번 이상, 최대 n번 이하로 반복 | a{2}: a가 2번 반복 a{2,}: a가 2번 이상 반복 a{2,5}: a가 최소 2번 이상, 최대 5번 반복 |
$ | 끝 | 문자열이나 행의 마지막을 의미한다. a$: a로 끝나는 문자열 |
? | 존재여부 | a?b는 a가 있을 수도, 없을 수도를 의미. b, ab |
[] | 포함 | [ ~ ] 안의 문자 중 하나를 선택한다. [abc]d는 ad, bd, cd를 의미한다. 또한, '-'와 함께 쓰면 범위를 지정해줄 수 있다. [a-z]는 a-z사이의 문자를 의미한다.(a-z, A-Z, 1-9 가능) |
[^ ] | 제외 | 해당 문자들은 제외한다는 의미이다. [^a-z]: 알파벳 소문자 제외 |
^ | 처음 | 문자열이나 행의 처음을 의미한다. ^a: a로 시작하는 문자열 |
$ | 끝 | 문자열이나 행의 마지막을 의미한다. a$: a로 끝나는 문자열 |
문자열의 처음부터 정규식(패턴)과 일치되는지 조사.
일치하는게 없을 경우 re.match는 None을 반환한다.
패턴이 발견되면 검색을 멈추고 패턴을 객체로 return 한다.
r = re.compile('[a-z]') # 소문자로 시작하는 패턴
m = r.match( "let's study hard" )
print(m.group()) # 결과: l
#문자열이 소문자로 시작하지 않을 경우
m_none = r.match("Let's study hard") # 소문자로 시작하지 않음= 일치하는게 없음
print(m_none) # 결과: None
print(m_none.group()) # 결과: AttributeError: 'NoneType' object has no attribute 'group'
m2 = re.match('[a-z]*', "let's study hard" ) # 소문자가 계속 반복되는 패턴
print(m2.group()) # 결과: let
match는 문자열의 처음부터 찾는다면, search는 처음부터 끝까지 확인.
일치하는게 없을 경우 re.search는 None을 반환한다.
패턴이 발견되면 검색을 멈추고 패턴을 객체로 return 한다.
r = re.compile('[a-z]') # 소문자로 시작하는 패턴
m = r.search( "Let's study hard" )
print(m)
# 결과: <re.Match object; span=(1, 2), match='e'>
# span(1,2)는 1번째 index인 e부터 시작하여, 2번째 인덱스 전까지를 의미한다.
print(m.group()) # 결과: e
m2 = re.search('[a-z]*', "let's study hard" ) # 소문자가 계속 반복되는 패턴
print(m2.group()) # 결과: let
문자열 중 패턴과 일치되는 부분을 모두 찾아 리스트 형태로 return 한다.
일치하는게 없을 경우 빈 리스트를 return.
r = re.compile('[a-z]') # 패턴: 소문자
m = r.findall('A Bc deF')
print(m)
# 결과: ['c', 'd', 'e']
m2 = r.findall('MY NAME IS..') # 소문자가 없음
print(m2)
# 결과: []
findall처럼 문자열 중 패턴과 일치되는 부분을 모두 찾는다.
다만, 매치되는 문자열을 iterator 객체로 return한다.
iterator 객체 값을 불러오려면 for문을 사용해야 한다.
r = re.compile('[a-z]') # 패턴: 소문자
m = r.finditer('A Bc deF')
print(m) # 결과: <callable_iterator object at 0x7f70ca5b1690>
# iterator 객체인 m을 불러오려면
for i in m:
print(i)
print(i.group())
# 결과
<re.Match object; span=(3, 4), match='c'>
c
<re.Match object; span=(5, 6), match='d'>
d
<re.Match object; span=(6, 7), match='e'>
e