TOP
class="layout-aside-left paging-number">
본문 바로가기
데이터분석 만능열쇠 [파이썬]/<파이썬 기초>

[파이썬] 파이썬기초: 정규 표현식(Regular Expressions) - 1

by 기록자_Recordian 2024. 6. 21.
728x90
반응형
시작에 앞서
해당 내용은 '<Do it! 점프 투 파이썬> 박응용 지음. 이지스 퍼블리싱' 을 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.

정규 표현식(Regular Expressions)

 

정규 표현식은 복잡한 문자열을 처리할 때 사용하는 기법

(* 파이썬 뿐 아니라 문자열을 처리하는 모든 곳에서 사용)

 

SQLD 2과목 SQL 활용 - 정규 표현식

서브쿼리집합연산자그룹 함수윈도우 함수TOP N 쿼리계층형 질의와 셀프 조인PIVOT 절과 UNPIVOT 절정규 표현식※ 자료출처: 데이터 산업 진흥원(K-DATA) 시작에 앞서..해당 범위는 2024년에 새롭게 추

puppy-foot-it.tistory.com

 

 

[SQLD] 정규표현식 (보강)

아시다시피 정규표현식이 2024년에 새로 추가된 범위라 자료찾기가 많이 어려웠다.[기존 자료] SQLD 2과목 SQL 활용 - 정규 표현식서브쿼리 집합연산자 그룹 함수 윈도우 함수 TOP N 쿼리 계층형 질

puppy-foot-it.tistory.com

▶ 예전에 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번 사용되어 매치


다음 글

 

[파이썬] 파이썬기초: 정규 표현식(Regular Expressions) - 2

시작에 앞서해당 내용은 ' 박응용 지음. 이지스 퍼블리싱' 을 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.이전 내용 [파이썬]

puppy-foot-it.tistory.com

 

728x90
반응형