Search

정규표현식

1. 기본

가. 대표문자(Meta sequence)

# 예제, 이하 3번째 줄의 빈칸에 정규표현식 삽입 # 빈칸에 정규표현식을 적습니다. regex = r'빈칸' 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(result)
Python
복사

1) \d, 숫자(digit)

0부터 9까지의 숫자 대표
빈칸에 \d 삽입 시 세로방향으로 숫자가 하나씩 출력됨

2) \w, 글자(word)

숫자(0~9)와 글자(A, b, c, 가, 나) 대표
특수문자 대표 X, 하지만 언더스코어(_)는 포함
빈칸에 \w 삽입 시 세로방향으로 글자가 하나씩 출력됨

나. 횟수 정하기(Quantifier)

1) +, 하나 또는 그 이상 연결된

\d+: 하나 또는 그 이상 연결된 숫자
빈칸에 \d+ 삽입 시 다음과 같이 출력됨
02 123 4567 ...
Python
복사

2) *, 0개 또는 그 이상 연결된

\d*: 숫자가 0개 이상
[1-9]\d*: 첫번째 자리는 1 - 9 사이의 숫자, 두번째 자리부터는 없거나 숫자로 연결된 것
빈칸에 [1-9]\d* 삽입 시 다음과 같이 출력됨
2 123 4567 ...
Python
복사
빈칸에 [1-9]\d+ 삽입 시 다음과 같이 출력됨
→ '02'에 대해서는 스킵함
→ 첫번째 digit '0'은 1-9 범주에 들지 않음
→ 두번째 digit '2'는 1-9 범주에 들어옴
→ 하지만 세번째 digit이 없으므로 02는 위의 정규표현식의 조건에 부합하지 않음
→ d+의 경우 하나 이상이므로 이어진 숫자가 있어야 함
→ 반면 d*의 경우 0개 이상으로 이어진 숫자가 있어야 하므로 '02'에 대해서 표현식 조건에 부합함
123 4567 70
Python
복사

3) ?, 있거나 없거나(Or)

-?: '-'가 있거나 없거나
\d+-?\d+-?\d+: 3자리의 숫자 중 '-'가 있는 것과 없는 것
['02-123-4567', '070-9999-9999', '010', '2454', '3457']
Python
복사
[- ]?: '-' 또는 공백이 있거나 없거나
\d+[- ]?\d+[- ]?\d+: 3자리의 숫자 중 '-' 또는 공백이 있거나 없는 것
['02-123-4567', '070-9999-9999', '010 2454 3457']
Python
복사

4) {숫자}: '숫자'번 반복

\d{2}: 숫자가 연속해서 두 번 나옴
{숫자1, 숫자2}: 숫자1부터 숫자2까지의 범위 내에서 반복 가능
\w{2,3}: 글자가 2개 또는 3개가 연속해서 나온다
\d{2,3}[- ]?\d{3,4}[- ]?\d{4}: 첫번째 자리수에는 숫자가 2개 또는 3개 연속, 두번째 자리수 ~~
['02-123-4567', '070-9999-9999', '010 2454 3457']
Python
복사

다. 고르기

1) [], 고르기

[aeiou]: 소문자 a, e, i, o, u 만 선택
u e a ...
Python
복사

2)[ - ], 범위에서 고르기

[a-z]: 모든 알파벳 소문자 고르기
[0-9]: 0과 양의 정수 고르기
[a-z]+: 모든 알파벳 소문자를 연속된 형태로 고르기
uke kywarker luke ...
Python
복사

3) [가-힣], 한글 고르기

[가-힣]+: 모든 한글 단어 고르기

라. 기타 대표문자

\s 공백 문자(스페이스, 탭, 뉴라인)
\S 공백 문자를 제외한 문자
\D 숫자를 제외한 문자
\W 글자 대표 문자를 제외한 글자들(특수문자, 공백 등)

2. Path Matching 활용

가. Path Matching 핵심 문법

1) 개괄

정규표현식은 The roq string literal syntax로 선언되어 사용됨
→ r'' 형태의 내부에 정규표현식이 선언
→ r'^book/(?P<pk>\d+)$'

나. 패턴 예제

1) r'^book/(?P<pk>\d+)$'

^book/: 문자열이 'book/'으로 시작하는지 검사
(?P<pk>\d+): 1개 이상의 숫자로 이루어진 패턴(\d+)을 찾아서 pk라는 이름의 변수에 할당하여 view에 전달
→ pk=1234
$: \d+에 따라 패턴의 마지막이 숫자로 끝나는지 확인
위의 정규표현식은 book/1234 형태의 패턴을 찾고 pk=1234를 view에 전달

2) r'^book/(\d+)$'

3) r'^book/(?P<stub>[-\w]+)$'

Reference

프로그래머스 정규표현식, https://programmers.co.kr/learn/courses/11