정규표현식
정규 표현식(Regular Expressions)은 복잡한 문자열을 처리할 때 사용 하는기법입니다. 정규식을 사용하는 경우 문자열 또는 데이터를 십게 변환 및 추출 할 수 있는 이점 이있습니다. 정규식 이라고도 합니다.
정규식이 필요한 이유
우리는 실제로 수많은 데이터를 다룹니다. 회원가입을 할때에도 개개인이 모두 달라서 데이터를 등록할때 핸드폰 번호를 "010-1234-5678" 일때도 있고 "01012345678" 일때 도 있죠? 지금이야 웹페이지에서 가입시 어떠한 조건을 만족해야만 처리가 이루어지지만 그렇지 않은경우도 많이 있을 것입니다.
뒤죽박죽 섞인 텍스트의 데이터들이 원하는 010 1234 5678 만 추출하고 나머지 다른 필요없는 규칙들은 제외하고 싶을 때 우리는 정규식을 사용할 수 있습니다.
정규식 활용 이해
다음과 같은 문제가 있다고 가정합니다.
주민등록번호를 포함하고 있는 텍스트가 있습니다. 이 텍스트에 포함된 모든 주민등록번호의 뒷자리를 * 문자로 변경해 봅시다.
정규식을 모르고 하드코딩을 한다면 아래와 같은 순서로 프로그램을 만들어야 할것입니다.
전체 텍스트를 스플릿을 사용해 공백 문자로 나눕니다
나뉜 단어가 주민등록번호 형식인지 확인한다.
단어가 주민등록번호 형식이라면 뒷자리를 * 로 변환한다.
나뉜 단어를 다시 조립 하도록 한다.
이 로직을 코드로 구현한다면 아래와 같을 것 입니다.
data = """
CHOI 910215-1234567
SON 810526-2234567
"""
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[:6] + "-" + "*******" #뒷자리 변환
word_result.append(word)
result.append(" ".join(word_result))
print("\n".join(result))
그러나 정규식을 사용하면 훨씬 간편하면서도 직관적으로 코드를 작성할 수 있습니다.
import re
data = """
CHOI 910215-1234567
SON 810526-2234567
"""
pat = re.compile("(\d{6})[-]\d{7}")
print(pat.sub("\g<1>-*******", data))
훨씬 간편하지 않나요? 정규식을 이해한다면 이것이 수백줄 수천줄 코드로 짜여져 있을경우 높은 가독성과 직관적인 코드를 짤 수 있을 것입니다. 또한 찾으려는 문자열 이나 문자열의 규칙이 매우 복잡한 경우에 정규식은 훨씬 강력합니다.
Last updated