Codong's Development Diary RSS 태그 관리 글쓰기 방명록
2021-02-24 00:30:41

🧐 정규표현식이란?


정규 표현식(regular expression, 간단히 regexp 또는 regex, rational expression) 또는 정규식(正規式)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히 펄과 Tcl은 언어 자체에 강력한 정규 표현식을 구현하고 있다.

즉, text에서 패턴을 파악해 찾고, 바꾸고, 지우고 등등을 할 수 있다! 전처리 단계에서 빠질 수 없는 부분! (언제까지 .split,.strip 등 만 쓸래??!!)


📝 사용법

아주 간단하다. import re를 한다음 여러가지 메서드를 사용하면 된다~~😆 자세한 설명은 밑에서..


💱메타문자


  1. 문자 클래스 [ ]
    문자 클래스로 만들어진 정규식은 "[ ] 사이의 문자들과 매치"라는 의미를 갖는다. 주로 [0-9] : 숫자, [가-힣] : 한글, [a-z] 이런식으로 많이 사용한다. 이 괄호 사이에 들어가는 다른 메타 문자들은 다 문자로 인식되므로 주의하기! 그리고 ^ 이 들어가면 not의 의미가 되므로 주의!

자주 사용하는 문자 클래스

  • \d : 숫자 [0-9]와 같다.
  • \D : 비숫자 [^0-9]와 같다.
  • \w : 숫자 + 문자 [a-zA-Z0-9]와 같다.
  • \W : 숫자 + 문자가 아닌 것 [^a-zA-Z0-9]와 같다.
  • \s : 공백 [ \t\n\r\f\v]와 같다.
  • \S : 비공백 [^ \t\n\r\f\v]와 같다.
  • \b : 단어 경계 ('\w'와 '\W'의 경계)
  • \B : 비단어 경계
  • .(dot) : \n을 제외한 모든 문자와 매칭

이것들은 한번만 쓰면 한 글자를 매칭한다. 그렇다고 3자리 숫자를 표현하는데 \d\d\d 이렇게 쓸 순없지 않는가? (사실 가능) 100자리 숫자면? \d\d\d\ ... \d\d? 말이 안된다. 그렇기에 등장한 것이...

  1. 반복
    문자 클래스 뒤에 붙이면 반복 된다.(ex. \d*) 종류는 다양하다
  • * : 0번째부터 반복된다.
  • + : 1번째부터 반복된다. ex) txt = aadd 일때 'aaddc*' (o) 'aaddc+' (x)
  • {m,n} : m부터 n까지 반복된다.
  • ? : 0번 아니면 1번 일때. {0,1} 이랑 같지만 이게 생각보다 쓸모있는게 태그 같은건 <h1> </h1> 이런식으로 /가 있을 수도 없을 수도 있기에 편리함.

제공되는 기능

search, findall,match, sub 등등 다양한 것이 있다.


👀 내가 자주 썻던 부분


한 줄로 re.sub( , , ) 로 간단하게 사용할 수 있지만, re.compile( 'Pattern' )을 사용하여 변수로 저장해두면 재사용 가능!

1️⃣ re.search('검색할 텍스트','패턴') : 텍스트 내에서 내가 원하는 패턴 위치 찾기

import re

text='지금 날짜는 2021. 02. 23 이래용 ㅎㅎㅎ'
p = re.compile(r'\d{4}.\s\d{1,2}.\s\d{1,2}')

# search 함수로 해당 텍스트의 시작 위치, 끝 위치 검색
# .span은 start index와 end index를 튜플로 반환
idx=p.search(text).span()

# 원래 text에서 위의 인덱스를 이용해 발췌
date = text[idx[0]:idx[1]]

print(date) # 출력 결과 >> 2021. 02. 23

2️⃣ re.sub('바꿀텍스트', '입력텍스트', '패턴') : '입력텍스트' 에서 '패턴'에 해당하는 부분을 '바꿀텍스트'로 바꾼다.

text='<h1>지금 날짜는 2021. 02. 23 이래용 ㅎㅎㅎ</h1>'

# [/]?는 /는 있어도 되고 없어도 되고, 알파벳 하나와 숫자하나 그리고 제일 밖 괄호
p = re.compile(r'\<[/]?[a-z][0-9]\>')

# 패턴에 해당하는 부분을 ''으로 바꿈 곧 없앰
pre_text=p.sub('',text)

print(pre_text) # 출력 결과 >> 지금 날짜는 2021. 02. 23 이래용 ㅎㅎㅎ

마무리

간만에 사용하게 되면서 생각보다 재밌음을 느꼈다. 물론 내가 적은 것 말고 그룹핑, 컴파일 옵션, 다양한 기능들... 등등 많지만 내가 사용하기엔 쓸만한 부분들은 적어뒀다고 생각한다. 다음에 다시 만났을 때 내가 안까먹길 바라면서 ... 이만 ... 👋

아참! 간단하게 테스트를 해볼 수 있는 사이트가 있다! 이곳에서 연습해서 적용시키는 것을 추천!

>> 실습하러가기 <<

reference