[코드잇] 정규표현식
강의 소개 : 정규 표현식은 문자열을 일정한 패턴으로 표현하는 방식입니다. 한번 잘 배워두면 프론트엔드, 백엔드, 데이터 분석 등 여러 가지 분야에서 활용할 수 있죠. 다양한 실습 예제를 통해 정규 표현식의 문법을 익혀 봅시다.
시작기호 | 정규식 패턴 | 종료기호 | 플래그 |
---|---|---|---|
/ | [bce]car | / | gi |
실제 값은 다르지만 패턴은 서로 동일한 문자열을 표현할 때 사용되는 형식 언어
/^(?=.*[a-zA-Z])(?=.*[0-9]).{8,}/
#'영문, 숫자 조합 8자 이상'인 문자열을 탐색하는 정규 표현식
# 이 외엔 비밀번호 생성이 되지 않도록 막는다.
# 원하는 문자열을 선택하여 값을 치환해 주는 상황에서 정규 표현식
(\d{6}[ ,-]-?[1-4]\d{6})|(\d{6}[ ,-]?[1-4]) # 주민번호
(\d{2}-\d{2}-\d{6}-\d{2}) # 운전면허번호
(\d{2,3}[ ,-]-?\d{2,4}[ ,-]-?\d{4}) # 핸드폰 번호
(([\w!-_\.])*@([\w!-_\.])*\.[\w]{2,3}) # 메일 주소
([a-zA-Z]{1}|[a-zA-Z]{2})\d{8} # 여권 번호
([0-9,\-]{3,6}\-[0-9,\-]{2,6}\-[0-9,\-]) # 계좌 번호
FLAVOR
- 언어 기반 설정하기TEST STRING
- 텍스트 본문 입력하는 곳REGULAR EXPRESSION
- 원하는 정규 표현식 작성하는 곳EXPLANATION
- 정규 표현식의 해석 내용 & 문법 설명MATCH INFORMATION
- 필요한 정규 표현식 문법 검색REGULAR EXPRESSION
에 작성 ➡️ TEST STRING
에서 하이라이트 처리
정규 표현식에 적용되는 설정을 조절해 주는 옵션 (기본 : gm
)
REGULAR EXPRESSION
우측에 위치
g
- 패턴과 일치하는 모든 것 추출 (생략할 경우 일치하는 것 중 가장 먼저 발견되는 것 하나만 추출)i
- 대소문자 구분 없이 추출m
- 문자열을 하나의 문장이 아니라 여러 줄로 인식하게 하기 (줄 바꿈을 문장의 경계로 인식)s
- .
이 줄 바꿈 문자 \n
도 포함하게 설정문자열의 특정한 규칙을 표현하기 위해서 사용
문자열의 특정한 규칙을 좀 더 쉽게 표현할 수 있도록 만들어진 예약어
[]
, -
, ^
, 문자 클래스
, .
등표현하고 싶은 문자를 대괄호 []
에 넣는 식으로 사용
# 고르기
[bce]ar ➡️ bar car ear 추출
문장에 있는 숫자 추출
# REGULAR EXPRESSION
[012345678]
# TEST STRING
010-1234-5678 ➡️ 0 1 0 1 2 3 4 5 6 7 8 추출
대문자 추출
[ABCDEFGHIJKLMNOPQRSTUVWXYZ]
소문자 추출
[abcdefghijklmnopqrstuvwxyz]
대문자와 소문자 붙어서 나오는 부분 추출
[ABCDEFGHIJKLMNOPQRSTUVWXYZ][abcdefghijklmnopqrstuvwxyz]
'하이픈 -
' 으로 문자 사이의 범위 더 간단하게 표현 가능
[0123456789] = [0-9]
⚠️ 하이픈은 아스키코드를 기준으로 범위를 계산 (낮은문자-높은문자 형식)
더 자세한 내용은 아스키코드표 참고
'캐럿 ^
' 으로 집합 안의 특정 문자들을 제외하여 선택 가능 ^허용문자
[^0-9] ➡️ 숫자를 제외한 모든 문자 추출
⚠️ 캐럿은 가장 앞에 작성해야 한다.
예제 : '이름 나이' 형태의 데이터에서 30대인 사람 찾는 정규표현식
[가-힣][가-힣] [34][0-9]
자주 사용하는 집합들을 좀 더 쉽게 사용할 수 있도록 한 일종의 예약어로,
보통 백슬래시 \
뒤에 특정 알파벳을 합쳐서 표기한다.
의미 | 집합 표현 | 문자 클래스 |
---|---|---|
숫자 | [0-9] | \d |
영어 대소문자+숫자+언더바 | [a-zA-Z0-9_] | \w |
공백 문자 | [\t\n\r\f\v] | \s |
부정의 의미를 가진 문자 클래스 :
의미 | 집합 표현 | 문자 클래스 |
---|---|---|
숫자가 아닌 것 | [^0-9] | \D |
영어 대소문자+숫자+언더바가 아닌 것 | [^a-zA-Z0-9_] | \W |
공백 문자가 아닌 것 | [^\t\n\r\f\v] | \S |
모든 문자를 의미
# REGULAR EXPRESSION
.
# TEST STRING
hi hello ➡️ hi hello 추출
# REGULAR EXPRESSION
h.
# TEST STRING
hi hello ➡️ hi he 추출
기본적으로 줄바꿈문자 \n
은 표현하지 못하지만, Flag에 s
를 추가하면 포함 가능하다.
정규 표현식의 시작과 끝을 나타내는 구분문자(delimiter)로 사용되는 /
와 더불어 []
, ^
, .
등의 문자를 메타 문자가 아니라 일반 문자로 사용하고 싶을 때,
앞에 \
입력하여 처리한다.
하나의 문자가 아니라 여러 번 반복되는 문자나 문자열을 선택하고 싶을 때
문자의 반복 횟수를 설정하는 문법 - 반복하고 싶은 문자{수량자}
\d{4}
= \d\d\d\d
= [0-9][0-9][0-9][0-9]
{min,max}
형태로 사용하면 수량자 범위 지정도 가능하다. (❗공백 X❗)
최대값을 빈칸으로 두면 최솟값 이상 글자가 모두 표시된다.
\d{3,6}
\d{2,}
수량자의 메타 문자로는 *
, +
, ?
가 있다.
*
- 제한 없이 모든 숫자, 앞에 문자가 하나도 없어도 선택 (0~무한대)+
- 제한 없이 모든 숫자, 앞에 최소 1개의 문자 반드시 필요 (1~무한대)?
- 문자가 아예 없거나 하나만 있을 경우 (0 or 1)\d*원
원 # 추출
1원 # 추출
\d+원
원 # 추출 X
1원 # 추출
jpe?g
jpg # 추출
jpeg. # 추출
*
잘못 사용 시, 최대한 큰 덩어리의 문자열을 찾으려고 하는 특성 때문에 탐욕적(greedy) 수량자 발생한다.
# REGULAR EXPRESSION
".*"
# TEST STRING
"Aa" "Bb" "Cc"
----------------------------------------------------------
Aa Bb Cc 각각이 추출되는 것이 아니라, "Aa" "Bb" "Cc" 가 통째로 추출
따라서 문자를 원하는 만큼만 일치시키기 위해 ?
통해 게으른 수량자 사용하면 된다.
.*
대신 ".*?"
사용1) 단어 경계 - 위치를 나타내는 메타 문자 \b
, \B
\b
- 문자\w
와 문자가 아닌 곳 \W
사이의 위치에 해당하는 경계\B
- 단어의 경계가 아닌 위치# 뒤에 오는 is만 선택
\bis\b
# This에 있는 is 선택
\Bis\b
2) 문장 경계 - 문장의 시작점 ^
, 문장의 끝 지점$
^선택하고 싶은 문장$
^
은 집합 안에서 쓰이면 부정, 밖에서 쓰이면 경계의 의미를 갖는다.Flag에 m
이 설정되어 있지 않으면, 줄 바꿈 되는 부분을 문장의 경계로 인식하지 않는다. 설정을 해야 불 바꿈이 된 지점 또한 문장의 경계로 인식한다.
()
정규 표현식 안에서 특정 패턴을 나타내는 표현식을 하나의 항목으로 처리하는 것
하위 표현식의 용도 :
1) 가독성
010-\d{3,4}-\d{4}
보다 (010)-(\d{3,4})-(\d{4})
가 좀 더 의미를 직관적으로 이해하기 쉽다.
2) 표현식의 반복
(표현식){n}
형태로, 표현식
내용을 n번 만큼 반복한다.
3) OR |
연산자 활용
(A|B)
형태로, A내용 또는 B내용을 포함한다.
알파벳 소문자, 대문자, 숫자만 사용 가능
[^\w]
.*\.docx
\d{6}-[1-4]\d{6]
^[^A-Z].*$
^(\d+[+\-*\/])*\d+$
하위표현식에 일치하는 문자열을 추출하여 다른 곳에서 그 패턴을 사용할 수 있다.
\n
# 중복 추출 - 단어1 공백 단어1
(\w+)\s\1
# (\w+) = \1
# html 코드 제대로 작동되는지 확인하기
<h(\d)>.*<\/h\1>
특정 패턴과 일치하는 문자열을 찾아서 원하는 문자열로 바꿀 수 있다.
FUNCTION
⏩ Substitution
이용REGULAR EXPRESSION
에 바꿀 문자열 입력, SUBSTITUTION
에 치환하고 싶은 문자열 입력\n
, \t
등)와 역참조($
)를 제외한 문법은 사용되지 않음# REGULAR EXPRESSION
(\w+)\s\1
# TEST STRING
Time is is gold
# SUBSTITUTION
$1
Time is gold
하위 표현식이지만 결과에는 반영되지 않고 특정 문자열을 찾기 위한 조건 역할만 하는 문법으로, 문자열을 찾기 위한 패턴의 일부가 되지만 해당 정규 표현식으로 찾아지는 문자열 결과에는 반영되지 않는 하위 표현식이다.
(?= )
(?<= )
(?! )
(?<! )
# 정규표현식
regex = r'0\d{1,2}[ -]?\d{3,4}[ -]?\d{3,4}'
# 주소록
search_target = '''Luke Skywarker 02-123-4567 luke@daum.net
다스베이더 070-9999-9999 darth_vader@gmail.com
princess leia 010 2454 3457 leia@gmail.com'''
# 정규표현식과 일치하는 부분을 모두 찾아주는 파이썬 코드
import re
result = re.findall(regex, search_target)
print("\n".join(result))