# 정규표현식

***

정규 표현식(Regular Expressions)은 복잡한 문자열을 처리할 때 사용 하는기법입니다.\
정규식을 사용하는 경우 문자열 또는 데이터를 십게 변환 및 추출 할 수 있는 이점 이있습니다.\
정규식 이라고도 합니다.

## 정규식이 필요한 이유

우리는 실제로 수많은 데이터를 다룹니다. 회원가입을 할때에도 개개인이 모두 달라서 데이터를 등록할때 핸드폰 번호를 "010-1234-5678" 일때도 있고 "01012345678" 일때 도 있죠?\
지금이야 웹페이지에서 가입시 어떠한 조건을 만족해야만 처리가 이루어지지만 그렇지 않은경우도 많이 있을 것입니다.

뒤죽박죽 섞인 텍스트의 데이터들이 원하는 010 1234 5678 만 추출하고 나머지 다른 필요없는 규칙들은 제외하고 싶을 때 우리는 정규식을 사용할 수 있습니다.

## 정규식 활용 이해

다음과 같은 문제가 있다고 가정합니다.

```
    주민등록번호를 포함하고 있는 텍스트가 있습니다. 이 텍스트에 포함된 모든 주민등록번호의 뒷자리를 * 문자로 변경해 봅시다.
```

정규식을 모르고 하드코딩을 한다면 아래와 같은 순서로 프로그램을 만들어야 할것입니다.

1. 전체 텍스트를 스플릿을 사용해 공백 문자로 나눕니다
2. 나뉜 단어가 주민등록번호 형식인지 확인한다.
3. 단어가 주민등록번호 형식이라면 뒷자리를 \* 로 변환한다.
4. 나뉜 단어를 다시 조립 하도록 한다.

**이 로직을 코드로 구현한다면 아래와 같을 것 입니다.**

```python
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))
```

**그러나 정규식을 사용하면 훨씬 간편하면서도 직관적으로 코드를 작성할 수 있습니다.**

```python
import re 

data = """
CHOI 910215-1234567
SON  810526-2234567
"""

pat = re.compile("(\d{6})[-]\d{7}")
print(pat.sub("\g<1>-*******", data))
```

훨씬 간편하지 않나요? 정규식을 이해한다면 이것이 수백줄 수천줄 코드로 짜여져 있을경우 높은 가독성과 직관적인 코드를 짤 수 있을 것입니다. 또한 찾으려는 문자열 이나 문자열의 규칙이 매우 복잡한 경우에 정규식은 훨씬 강력합니다.

***

[참고 : 점프 투 파이썬](https://wikidocs.net/1642)
