본문 바로가기

인문학도 개발일지/웹프로그래밍

[python] 점프 투 파이썬 정규표현식 기초 - 메타문자

예제

Q. 텍스트에 포함 된 주민번호의 뒷자리를 *로 바꿔보자.

- 일반 코드로 구현했을 때

data = """
park 921122-2012345
kim  970322-1012345
"""

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 = """
park 921122-2012345
kim  970322-1012345
"""

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

 

 

 

정규 표현식의 기초, 메타 문자

- 메타문자: 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자

. ^ $ * + ? { } [ ] \ | ( )

 

 

문자 클래스 [ ]

- [ ] 사이의 문자들과 매치

- 문자 클래스를 만드는 메타 문자인 [ ] 사이에는 어떤 문자도 들어갈 수 있다.

예) 정규표현식 [abc] -> a, b, c 중 한 개의 문자와 매치
"a" -> 정규식과 일치하는 문자 "a"가 있으므로 매치
"before" -> 정규식과 일치하는 문자 "b"가 있으므로 매치
"dude" -> 정규식과 일치하는 문자가 없으므로 매치되지 않음

- [ ♥ - ★ ] : ♥ 부터 ★ 까지

예)
[a-zA-Z]: 알파벳 모두
[0-9]: 숫자

- 문자 클래스 [ ] 안에는 어떤 문자나 메타 문자도 사용할 수 있다.

- ^문자는 not을 의미

예)
[^0-9]: 숫자 아닌 문자만 매치

- 자주 사용하는 문자 클래스

\d - 숫자와 매치, [0-9]와 동일.
\D - 숫자가 아닌 것과 매치, [^0-9]와 동일.
\s - whitespace 문자와 매치, [ \t\n\r\f\v]와 동일. 맨 앞의 빈 칸은 공백문자(space)를 의미.
\S - whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일.
\w - 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일.
\W - 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_]와 동일.
대문자로 사용된 것은 소문자의 반대

 

 


Dot(.) 

- 줄바꿈 문자인 \n을 제외한 모든 문자와 매치

- re.DOTALL옵션을 주면 \n 문자와도 매치 된다.

- 예: a.b -> "a + 모든 문자 + b"

- 예: a[ . ]b ->  "a.b" 문자열과 매치

 

 

 

반복 (*) 

- * 바로 앞에 있는 문자가 0부터 무한대로 반복될 수 있음

- 실제로는 메모리 제한으로 2억개 정도만 가능

- 예:

정규식 문자열 Match 여부 설명
ca*t ct Yes "a"가 0번 반복되어 매치
ca*t cat Yes "a"가 0번 이상 반복되어 매치 (1번 반복)
ca*t caaat Yes "a"가 0번 이상 반복되어 매치 (3번 반복)

 

 


반복 (+) 

- 최소 1번 이상 반복될 때

- *는 반복횟수 0부터, +는 반복횟수 1부터

- 예:

정규식 문자열 Match 여부 설명
ca+t ct No "a"가 0번 반복되어 매치되지 않음
ca+t cat Yes "a"가 1번 이상 반복되어 매치 (1번 반복)
ca+t caaat Yes "a"가 1번 이상 반복되어 매치 (3번 반복)

 

 

 

반복 ({m,n}, ?)

- 반복 횟수 고정

- 반복횟수를 m부터 n까지 매치, 또는 m이나 n을 생략 가능

- 생략된 m은 0과 동일, 생략된 n은 무한대의 의미

- 예: {3,} -> 반복 횟수가 3 이상

- 예: {,3} -> 반복 횟수가 3 이하

정규식 문자열 Match 여부 설명
ca{2}t cat No "a"가 1번만 반복되어 매치되지 않음
ca{2}t caat Yes "a"가 2번 반복되어 매치
ca{2,5}t cat No "a"가 1번만 반복되어 매치되지 않음
ca{2,5}t caat Yes "a"가 2번 반복되어 매치
ca{2,5}t caaaaat Yes "a"가 5번 반복되어 매치

 

 

 

?

- {0, 1}의 의미

- 예: ab?c -> "a + b(있어도 되고 없어도 된다) + c"

- 예:

정규식 문자열 Match 여부 설명
ab?c abc Yes "b"가 1번 사용되어 매치
ab?c ac Yes "b"가 0번 사용되어 매치