정규표현식(Regular Expressions)
복잡한 문자열을 처리하는 기법으로 파이썬 외에도 문자열을 처리하는 모든 곳에서 사용한다.
파이썬은 정규 표현식을 지원하기 위해 re모듈을 제공한다. re(regular expression의 약어)모듈은 파이썬 설치시 자동으로 설치되는 기본 라이브러리다.
import re
p = re.compile('패턴')
메타문자
메타문자를 사용해서 특별한 의미를 갖게한다.
정규표현식에서 사용하는 메타문자들 => . ^ $ * + ? { } [ ] \ | ( )
1. 문자클래스 : [ ] => []사이의 문자들과 매치
[] : 문자
[a] : a문자
[a-z] : 소문자
[A-Za-z] : 영문자
[0-9A-Za-z] or \w : 영문자+숫자
\W : 영문자+숫자가 아닌 문자와 매치
[0-9] or \d: 숫자
[^0-9] or \D : 숫자가 아닌 것(^ : 반대(not))
\s : 공백문자 1개이상(\f \n \r \f \v와 동일)
\S : 공백문자가 아닌 문자(^\f \n \r \f \v와 동일)
2. Dot : . => .자리에 어떤 문자가 들어와도 모두 매치
a+.(Dot)+b : a + 줄바꿈(\n) 제외한 모든문자 + b
a[.]b : a와 b 사이에 문자 '.' 이 있으면 매치
3. 반복 : * => 바로 앞에 있는 문자가 0개 이상 반복되면 매치
ca*t : a문자는 0개이상
ct : true
cat : true
caat : true
4. 반복 : + => 바로 앞에 있는 문자가 1번 이상 반복되면 매치
ca+t : a문자는 1개이상
ct : false
cat : true
caat : true
5. 반복 : {m} => 바로 앞에 문자가 반드시 갯수만큼 반복되면 매치
ca{2}t : a문자가 2개
ct : false
cat : false
caat : true
caaat: false
6. 반복 : {m,n} => 바로 앞에 문자가 m~n번 사이의 갯수만큼 반복되면 매치
ca{2,5}t : a 문자가 2개이상 5개이하
ct : false
cat : false
caat : true
caaaaat: true
7. 반복 : ? => 0번 또는 1번 사용되면 매치
ca?t : a문자는 없거나, 1개만 가능
ct : true
cat : true
caat : false
문자열 소비가 없는 메타 문자(zero-width assertions)
1. | => or
2. ^ => 문자열의 맨 처음과 매치함(여러줄일경우 각 줄의 처음과 일치)
3. $ => 문자열의 끝과 매치함(여러줄일경우 각 줄의 끝과 일치)
4. \A => 문자열의 맨 처음과 매치(여러줄일경우에도 전체 문자열의 처음하고만 일치)
5. \Z => 문자열의 맨 끝과 매치(여러줄일경우에도 전체 문자열의 끝하고만 일치)
6. \b => 단어 앞뒤에 사용하면 whitespace로 구분된 단어와 매치
7. \B =>단어 앞뒤에 사용하면 whitespace로 구분된 단어가 아닌 경우에만 매치
그루핑
() : 그룹. 설정
\g<n> : n번째 그룹 조회.
정규식을 사용한 문자열 검색
match() : 문자열의 처음부터 정규식과 매치되는지 조사 후 match객체를 돌려주고 부합하지 않을 경우는 None을 돌려준다.
search() : 문자열 전체를 검색하여 정규식과 매치되는지 조사후 match객체를 돌려준다. 없을 경우는 None.
findall() : 정규식과 매치되는 모든 문자열을 리스트로 돌려준다.
finditer() : findall과 동일하지만 결과로 반복 가능한 객체를 돌려준다. 반복 가능한 객체가 포함하는 각각의 요소는 match 객체이다.
import re
m = re.search('[a-z]+',"python") #컴파일과 search메서드를 한번에 수행
print(m)
# <re.Match object; span=(0,6), match='python'>
'''
match객체의 메서드
group() : 매치된 문자열을 돌려준다.
start() : 매치된 문자열의 시작 위치를 돌려준다.
end() : 매치된 문자열의 끝 위치를 돌려준다.
span(시작, 끝) : 매치된 문자열의 (시작,끝)에 해당하는 튜플을 돌려준다.
'''
컴파일 옵션
import re
p = re.compile('패턴', re.컴파일옵션)
DOTALL(S) : dot문자가 줄바꿈 문자를 포함하여 모든 문자와 매치한다.
IGNORECASE(I) : 대.소문자 관계 없이 매치한다.
MULTILINE(M) : 여러줄과 매치한다.(^,$ 메타 문자의 사용과 관계있는 옵션)
VERBOSE(X) : verbose모드를 사용한다.(정규식을 보기 편하게 만들 수 있고 주석 등을 사용 할 수도 있다.)
백슬래시 문제
'\section' #백슬래시로 인식
'\\section' #'\section'
'\\\\\\section' #'\\\section'
# 백슬래시가 많아질수록 복잡해진다. 정규식 문자열 앞에 r을 삽입하면 \를 문자로 인식한다.
p=re.compile(r'\\section') #'\\section'
정규식으로 주민번호 감추기
#주민번호 감추기
data = '''
park 800905-1234567
kim 700905-2234567
choi 850101-a123456
'''
result = []
for line in data.split("\n"):
word_result = []
for word in line.split(' '):
if len(word)==14 and word[:6].isdigit() and word[7:].isdigit():
word = word[:7] + "*******"
word_result.append(word)
result.append(" ".join(word_result))
print("\n".join(result))
#정규화 모듈 이용하여 주민번호 감추기
import re
data = '''
park 80090100-1234567
kim 700905-2234567
choi 850101-a123456
'''
'''
(\\d{6}) : 그룹
\d{6} : \d 숫자 {자리숫}. 숫자 6자리
[-] : - 문자
\d{7} : 숫자 7자리
pat.sub : data문자열에서 패턴 찾아서 변경
# \g<1> : 첫번째 ()그룹
'''
pat = re.compile("(\\d{6})[-]\\d{7}")
print(pat.sub("\g<1>-*******",data))
'프로그래밍언어 > Python' 카테고리의 다른 글
[Python] pandas 모듈 (0) | 2022.01.12 |
---|---|
[Python] Numpy 모듈 (0) | 2022.01.11 |
[Python] 예외 처리 (0) | 2021.12.29 |
[Python] 모듈 (0) | 2021.12.29 |
[Python] 클래스 (0) | 2021.12.29 |