본문 바로가기

IT 차곡차곡/Python

[Python] 정규표현식 1

정규 표현식

복잡한 문자열을 처리할 때 사용하는 기법이다. 정규 표현식은 줄여서 정규식이라고도 한다.

 

파이썬의 정규표현식을 사용하는 방법

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