시작에 앞서
해당 내용은 '<Do it! 점프 투 파이썬> 박응용 지음. 이지스 퍼블리싱' 을 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.
정규 표현식(Regular Expressions)
정규 표현식은 복잡한 문자열을 처리할 때 사용하는 기법
(* 파이썬 뿐 아니라 문자열을 처리하는 모든 곳에서 사용)
▶ 예전에 SQLD 시험 관련 내용에서도 정규 표현식 내용을 넣었었다.
정규 표현식 활용의 예
예를 들어, 아래와 같은 주제가 주어졌을 때
주민등록번호를 포함하고 있는 텍스트에 포함된 모든 주민등록번호의 뒷자리를 * 문자로 변경 (마스킹)
정규식을 사용하지 않을 경우 다음의 순서로 프로그램이 작성된다.
1. 전체 텍스트를 공백 문자로 분할(split)
2. 나뉜 단어가 주민등록번호 형식인지 조회
3. 단어가 주민등록번호 형식이면 뒷자리를 *로 변환
4. 나뉜 단어를 다시 조립
[코드 - 정규 표현식 사용 X]
result = []
for line in data.split("\n"):
word_result = []
for word in line.split(" "): #공백 문자마다 나누기
if len(word) == 14 and word[:6].isidigit() and word[7:].isdigit():
word = word[:6] + "=" + "*******"
word_result.append(word)
result.append(" ".join(word_result)) #나눈 단어 조립하기
print("\n".join(result))
result = []
for line in data.split("\n"):
word_result = []
for word in line.split(" "): #공백 문자마다 나누기
if len(word) == 14 and word[:6].isidigit() and word[7:].isdigit():
word = word[:6] + "=" + "*******"
word_result.append(word)
result.append(" ".join(word_result)) #나눈 단어 조립하기
print("\n".join(result))
만약에 정규 표현식을 사용하면 훨씬 간편하고 직관적인 코드를 작성할 수 있다.
#정규 표현식: 주민 번호 뒷자리 * 로 마스킹 처리
import re #정규 표현식을 사용하기 위한 모듈
data = """
park 880808-1011123
kim 801225-2100999
lim 920417-1037777
Jeon 040101-3214351
Pyo 020303-4332001
"""
pat = re.compile("(\d{6})[-]\d{7}")
print(pat.sub("\g<1>-*******", data))
▶ 만약 찾으려는 문자열 또는 바꾸어야 할 문자열의 규칙이 매우 복잡하다면 정규식은 더 유용해진다
메타 문자(Meta Characters)
메타 문자란 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자를 말한다.
. ^ $ & + ? { } [ ] \ | ( )
◆ 문자 클래스 [ ]: [ ] 사이의 문자들과 매치
예를 들어, 정규 표현식이 [abc] 라면 이 표현식은 'a, b, c 중 한 개의 문자와 매치'를 의미한다.
※ [ ] 안의 두 문자 사이에 하이픈(-)을 사용하면 두 문자 사이의 범위(From-To)를 의미한다.
ex. [a-c]: [abc] [0-5]: [012345] [a-zA-Z]: 알파벳 모두
문자 클래스([ ]) 안에는 어떤 문자나 메타 문자도 사용할 수 있지만, 문자 클래스 안에 ^ 메타 문자를 사용할 경우에는 반대(not)라는 의미를 가진다. 예를 들어 [^0-9] 라는 표현식은 숫자가 아닌 문자만 매치된다.
★ 자주 사용하는 문자 클래스
정규 표현식 | 설명 |
\ d | 숫자와 매치, [0-9]와 동일한 표현식 |
\ D | 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식 |
\ s | whitespace 문자(space 또는 Tab 처럼 공백을 표현하는 문자)와 매치, [ \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을 제외한 모든 문자와 매치됨을 의미.
a.b : a와 b 사이에 줄바꿈 문자를 제외한 어떤 문자가 들어와도 모두 매치
= "a + 모든 문자 + b"
aab → 매치 됨
a0b → 매치 됨
abc → 매치 안 됨 (a와 b 문자 사이에 문자 하나라도 있어야 하기 때문)
※ a[.]b = "a + Dot(.) 문자 + b"
a0b → 매치 안 됨
a.b → 매치 됨
◆ 반복(*) : 0번 이상 반복되면 매치
ca*t : * 문자 바로 앞에 있는 a가 0번 이상 반복되면 매치
ct → 매치 됨 : "a"가 0번 이상 반복되어 매치
cat → 매치 됨: "a"가 0번 이상 (1번) 반복되어 매치
caat → 매치 됨 : "a"가 0번 이상 (2번) 반복되어 매치
◆ 반복(+) : 1번 이상 반복되면 매치
ca+t : + 문자 바로 앞에 있는 a가 1번 이상 반복되면 매치
ct → 매치 안 됨 : "a"가 1번 이상 반복되지 않아 매치되지 않음
cat → 매치 됨: "a"가 1번 이상 (1번) 반복되어 매치
caat → 매치 됨 : "a"가 1번 이상 (2번) 반복되어 매치
◆ 반복({m}) : m번 반복되면 매치
ca{2}t : { } 바로 앞에 있는 a가 2번 반복되면 매치
ct → 매치 안 됨 : "a"가 2번 반복되지 않아(0번) 매치되지 않음
cat → 매치 안 됨 : "a"가 2번 반복되지 않아(1번) 매치되지 않음
caat → 매치 됨 : "a"가 2번 반복되어 매치
◆ 반복({m, n}) : m~n번 반복되면 매치
ca{2, 5}t : { }문자 바로 앞에 있는 a가 2~5번 반복되면 매치
ct → 매치 안 됨 : "a"가 2번 반복되지 않아(0번) 매치되지 않음
cat → 매치 안 됨 : "a"가 2번 반복되지 않아(1번) 매치되지 않음
caat → 매치 됨 : "a"가 2번 반복되어 매치
caaaat → 매치 됨 : "a"가 4번 반복되어 매치
caaaaaat → 매치 됨 : "a"가 6번 반복되어 매치되지 않음
◆ ? : 있어도 되고 없어도 된다
ca?t : ? 문자 바로 앞에 있는 a가 0~1번 사용되면 매치
ct → 매치 됨 : "a"가 0번 사용되어 매치
cat → 매치 됨 : "a"가 1번 사용되어 매치
다음 글
'[파이썬 Projects] > <파이썬 기초>' 카테고리의 다른 글
[파이썬] 파이썬기초: 정규 표현식(Regular Expressions) - 3 (0) | 2024.06.22 |
---|---|
[파이썬] 파이썬기초: 정규 표현식(Regular Expressions) - 2 (0) | 2024.06.22 |
[파이썬] 파이썬 기초: 내장 함수(Built-in Functions) (0) | 2024.06.20 |
[파이썬] 파이썬기초: 예외 처리(Exception Handling) (0) | 2024.06.20 |
[파이썬] 파이썬기초: 입력과 출력, 파일 읽고 쓰기 (0) | 2024.06.19 |