정규 표현식
복잡한 문자열을 처리할 때 사용하는 기법이다. 정규 표현식은 줄여서 정규식이라고도 한다.
파이썬의 정규표현식을 사용하는 방법
1. 정규표현식 모듈 불러오기
import re
2. 정규표현식 패턴 생성하기
pattern = re.compile('패턴')
3. 패턴으로 문자열을 검색(확인)
3-1. 문자열의 처음부터 일치하는지 확인
pattern.match('문자열')
3-2. 문자열의 전체의 일부 일치하는지 확인
pattern.search('문자열')
3-3. 문자열의 전체에서 일치하는지 확인 후 모두를 목록(배열)화
pattern.findall('문자열')
import re
# 영어 소문자가 최소 1번이상 나열되는 패턴
pat = re.compile("[a-z]+")
match : 처음부터 일치하는지 확인
print(pat.match("python is very easy")) # 공백이 나오기전까지 6자리만 확인
print(pat.match("1python is very easy")) # 첫 문자가 1로 시작되어 일치X
결과
<re.Match object; span=(0, 6), match='python'>
None
search : 중간의 내용도 검색
print(pat.search("python is very easy"))
print(pat.search("1-*/python is very easy"))
결과
<re.Match object; span=(0, 6), match='python'>
<re.Match object; span=(1, 7), match='python'>
findall : 문자열 전체에서 모두 검색 후 목록으로 만든다
print(pat.findall("python is very easy"))
print(pat.findall("1-*/python is very easy"))
결과
['python', 'is', 'very', 'easy']
['python', 'is', 'very', 'easy']
- finditer : findall과 동일하지만 결과로 반복가능한 객체를 돌려준다. for문을 이용해 반복할 수 있다.
- 반복가능한 객체가 포함하는 각가의 요소는 match 객체이다.
import re
pat = re.compile('file[0-9]')
print(pat.match('fileA filex file1 file5 file9 file!')) # 불일치
print(pat.search('fileA filex file1 file5 file9 file!')) # file1
print(pat.findall('fileA filex file1 file5 file9 file!')) # ['file1', 'file5', 'file9']
print("--------------------------------------")
objs = pat.finditer('fileA filex file1 file5 file9 file!')
for obj in objs:
print(obj)
결과
None
<re.Match object; span=(12, 17), match='file1'>
['file1', 'file5', 'file9']
--------------------------------------
<re.Match object; span=(12, 17), match='file1'>
<re.Match object; span=(18, 23), match='file5'>
<re.Match object; span=(24, 29), match='file9'>
- match와 search 메소드는 찾는 위치만 다르고 반환받는 객체는 동일하게 re.Match객체이다.
pat = re.compile('file[0-9]')
obj1 = pat.match('file0 filex file1 file5 file9 file!')
obj2 = pat.search('file0 filex file1 file5 file9 file!')
print(obj1)
print(obj2)
결과
<re.Match object; span=(0, 5), match='file0'>
<re.Match object; span=(0, 5), match='file0'>
주민등록번호 정규표현식으로 표현하기
1. 주민등록번호는 문자열(str)이어야 하고, 14자리이다.
2. 단어가 주민등록번호의 형식이 맞다면 뒷자리를 *로 반환한다.
정규표현식 적용 전
data = """park 800905-1049118
kim 700905-1059119
lee 010-1234-5678
moon 900905-2012339
kang 02-5656-7878"""
rows = data.split('\n')
for row in rows:
datas = row.split()
for data in datas:
if len(data) == 14 and data[:6].isdigit() and data[6] == '-' and data[7:].isdigit():
print(data[:7]+'*******', end=" ")
else:
print(data, end =" ")
print()
결과
park 800905-*******
kim 700905-*******
lee 010-1234-5678
moon 900905-*******
kang 02-5656-7878
정규 표현식 적용 후
import re
data = """park 800905-1049118
kim 700905-1059119
lee 010-1234-5678
moon 900905-2012339
kang 02-5656-7878"""
# ([0부터9의 숫자]{6자리})[-][0부터9숫자]{7자리}
pattern = re.compile("([0-9]{6})[-][0-9]{7}")
# sub(바꾸고싶은 문자열, 기존 문자열), \g<1> : (괄호)로 묶은 첫 번 째 그룹
print(pattern.sub('\g<1>-*******',data))
결과
park 800905-*******
kim 700905-*******
lee 010-1234-5678
moon 900905-*******
kang 02-5656-7878
'IT 차곡차곡 > Python' 카테고리의 다른 글
[Python] 정규표현식3 - Dot(.), 반복(*, +, {m,n}) (0) | 2021.06.23 |
---|---|
[Python] 정규표현식2 - 문자열 매치 [ ] (0) | 2021.06.23 |
[Python] 문자열 거꾸로 출력하기 (0) | 2021.06.18 |
[Python] 파이썬 문자, 아스키코드로 변환 (chr, ord) (0) | 2021.06.17 |