📍정규 표현식
특정한 규칙을 가진 문자열의 집합을 표현하기 위해 사용하는 형식
목적
- 문자열의 검색과 치환
- 간단한 표현
- 조건문 간소화
import re #정규 표현식 사용을 위한 모듈 re(regular expression)
example = re.compile('ab*c') #p는 컴파일된 객체
그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자
. ^ $ * + ? { } [ ] \ | ( )
[0-9] : 숫자
[a-z] : 소문자
[A-Z] : 대문자
[a-zA-Z] : 영문자
[가~힣] : 완성형 한글
[ ]
Character class[ ] 안의 문자들과 매치되는 지
정규표현식 [abc]
.
Dot(.)정규표현식 a.b
"a + 모든문자 + b"
a[.]b
: 'a'와 'b'로 감싸져있는 문자열과 매치ab*c
0번이상 반복
ac
: "b"가 0번 반복되어 매치abc
: "b"가 1번 반복되어 매치abbbbc
: "b"가 3번 반복되어 매치ab+c
1번이상 반복
ac
: "a"가 0번 반복되어 매치X abc
: "a"가 1번 반복되어 매치abbbbc
: "a"가 4번 반복되어 매치{ } 메타 문자를 사용하면 반복 횟수 고정
{m, n} : m부터 n까지 매치
ex)
{5,}
: 5번 이상 반복
{,5}
: 5번 이하 반복
{m} : 반드시 m번 반복
ab{3}c
반드시 'b'를 3번 반복
abbbbc
: 'b'가 4번 반복되기 때문에 매치Xabbbc
: 'b'가 3번 반복되기 때문에 매치 {m, n} : m~n번 반복
ab{3,6}c
: 3~6번 반복
abc
: 'b'가 1번만 반복되어 매치 x abbbc
: 'b'가 3번 반복되어 매치 abbbbbbc
: 'b'가 6번만 반복되어 매치 ?
메타문자 ?
의 의미 : {0,1}
ex)
ab?c
"b? 있어도되고 없어도돼." 라는 뜻
ac
: 없어도 매치니까 매치abc
:있어도 매치니까 매치컴파일된 객체를 사용하여 문자열 검색
문자열[0]부터 매치되는지 조사
import re
p = re.compile('[a-z]+') #영어 소문자
print(p.match("abcde")) #<re.Match object; span=(0, 5), match='abcde'>
print(p.match("12345")) #None
print(p.search("123 abc")) #None / 문자열[0]부터 비교하기때문에 중간부분이 매치되더라도 None
문자열 전체를 검색
import re
p = re.compile('[a-z]+') #영어 소문자
print(p.search("abcde")) #<re.Match object; span=(0, 5), match='abcde'>
print(p.search("ab cde")) #<re.Match object; span=(0, 2), match='ab'>
print(p.search("123 abc")) #<re.Match object; span=(4, 7), match='abc'>
#search는 문자열 전체를 검색하기 때문에 중간부분에서 매치가 시작되도 매치성공
p와 매치하여 리스트로 반환
import re
p = re.compile('[a-z]+') #영어 소문자
print(p.findall("jeong ji min")) #['jeong', 'ji', 'min']
print(p.findall('123 jeong ji 456 min')) #['jeong', 'ji', 'min']
import re
p = re.compile('[a-z]+') #영어 소문자
m = p.finditer('jeong ji min')
for i in m :print(i)
'''
<re.Match object; span=(0, 5), match='jeong'>
<re.Match object; span=(6, 8), match='ji'>
<re.Match object; span=(9, 12), match='min'>
'''
or
match할 문자열의 앞부분부터 A|B
A 또는 B와 일치하는지
import re
p = re.compile('Jeong|jimin')
print(p.match('Jeongminji')) #<re.Match object; span=(0, 5), match='Jeong'>
print(p.match('jiminJeong')) #<re.Match object; span=(0, 5), match='jimin'>
print(p.match('Kimjimin')) #None
문자열의 맨 처음과 일치하는 지
import re
print(re.search('^Hello', 'Hello it`s me')) #<re.Match object; span=(0, 5), match='Hello'>
문자열의 끝과 일치하는 지(^
메타 문자와 반대)
import re
print(re.search('me$', 'Hello it`s me'))
#<re.Match object; span=(11, 13), match='me'>