예제
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번 사용되어 매치 |
'인문학도 개발일지 > 웹프로그래밍' 카테고리의 다른 글
Build a Backend REST API with Python & Django - 사용 기술 (0) | 2020.07.28 |
---|---|
[python] 점프투파이썬 정규표현식 지원 모듈: re (0) | 2020.07.13 |
[NLP] 자연어처리 - 개요 및 작업 환경 갖추기 (0) | 2020.04.12 |
[파이썬][웹크롤링] 도널드 트럼프 트위터 크롤링하기 (15) | 2020.04.12 |
[파이썬][pandas] 기업 주식 데이터 불러오기 - DataReader (0) | 2020.04.11 |