사용해보기
REPL 사용하기
메타 문자
설명
.
(dot) : 숫자와 문자 특수기호, 공백 등을 포괄한 모든 범위의 한 글자^
(circumflex) : 문자열의 시작점. 그러나 일반적으로는 한 줄의 시작점을 의미한다. 문자클래스 집합에서는 다른 의미를 갖는다.$
(dollar) : 문자열의 끝점. 그러나 일반적으로는 한 줄의 끝점을 의미한다.\
(back slash) : 메타문자를 검색하기 위하여 특수문자 앞에 사용한다. 마침표 . 를 찾기 위해 . 을 사용한다.|
(vertical bar) : 또는 을 의미한다. (고구려|백제|신라) 를 찾으면 고구려 또는 백제, 신라를 찾게 된다.
이스케이프 문자
설명
\w
: 영문자와 숫자, 언더스코어_
\W
: 영문자와 숫자, 언더스코어가 아닌 문자\d
: 10진수로 된 숫자\D
: 10진수 숫자가 아닌 모든 문자(공백 포함)\s
: 탭, 줄바꿈 등 지정된 공백문자 [\t\n\r\f\v]\S
: 위 공백문자가 아닌 모든 글자\t
: 일반적으로 탭(TAB)키를 입력했을 때 나오는 일정 간격을 유지하는 공백
예시
전화번호를 찾기 위한 첫 단계는 숫자를 찾아내는 겁니다.
regex = r'\d'
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))
예시결과
\d
는 숫자를 대표하는 정규표현식입니다. 이때 d는 digit을 뜻합니다.
The r means that the string is to be treated as a raw string, which means all escape codes will be ignored.
특수 문자
?
: 문자가 없거나 하나인 경우*
: 문자가 없거나 하나 이상 존재하는 경우+
: 문자가 하나 이상 존재하는 경우
예시
\d는 숫자를 한글자만 찾습니다. 그런데, 전화번호를 구성하는 043이나 2568같이 연결된 숫자를 찾고 싶을 때는 어떻게 해야 할까요?
regex = r'\d+'
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))
예시결과
그럴 땐 +를 이용하면 됩니다. +는 하나 혹은 그 이상 연결된이라는 뜻입니다. 따라서 \d+는 하나 혹은 그 이상 연결된 숫자를 의미합니다.
대괄호 : 문자 클래스의 집합
문자 클래스란 문자열, 특수문자 등을 등잘할 수 있는 형태를 표시한 것
[0-9]
: 0부터 9까지의 숫자 집합을 의미[A-Z]
: 영어 대문자 집합[AEIOUaeiou]
: 영어에서 a,e,i,o,u로 이루어진 대소문자 집합[가-힣]
: 가부터 힣까지의 한글자모부분을 제외한 한글집합
대괄호 내에 ^가 들어가면 ^ 뒤에 나오는 문자 클래스는 해당 집합에서 제외한다는 의미
[^0-9]
: 0부터 9까지의 숫자 집합을 제외한다는 의미이며, 이스케이프 문자 \D와 동일한 의미[^A-Z]
: 행의 앞쪽이 영어 대문자 집합인 것을 제외하고 찾으라는 의미[0-9+\-*/\^\(\)=]
: 숫자와 사칙연산 부호 등(+, -, *, /, ^, \=)을 찾으라는 의미
예시
정규표현식으로 010, 123, 456 중 자연수를 찾으려면 어떻게 해야 할까요?
regex = r'[1-9]\d*'
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))
예시결과
자연수는 다음과 같이 표현할 수 있습니다.
- 처음에 1~9중 하나의 숫자가 나온 다음
- 그 뒤에는 숫자가 0개 이상 나오면
은 0개 이상이라는 뜻입니다. 따라서 \d는 숫자가 0개 이상이다를 의미합니다. 이를 이용하면 자연수는 [1-9]\d*로 표현할 수 있습니다.
중괄호 : 수량자
수량자 앞의 글자 혹은 문자클래스 집합의 글자수가 얼마나 되는지를 지정하는 것
[0-9]{5}
: 5자리의 숫자 집합[A-Za-Z]{3,}
: 3글자 이상의 영어 단어 집합[A-Za-z0-9]{4,8}
: 4글자 이상 8글자 이하의 영어 대소문자와 숫자로 이루어진 집합
수랑자 & 특수문자
?
: {0,1} 문자가 없거나 하나인 경우*
: {0,} 문자가 없거나 하나 이상 존재하는 경우+
: {1,} 문자가 하나 이상 존재하는 경우
게으른 수량자 ?
.+
: 한 줄을 의미.+?
: .와 동일한 결과를 가져온다..{3,}
: 3글자 이상의 한 줄.{3,}?
: 한 줄을 3글자 단위로 끊은 결과를 보여준다.
소괄호 : 그룹
충청(남|북)?도
: 충청남도, 충청북도, 충청도를 의미
Flag
g
: (Global) 문자열 내의 모든패턴을 찾는다.i
: (Ignore Case) 문자의 대소문자를 구별하지 않음m
: (multi Line) 문자열이 행이 바뀌어도 찾는다.
풀어보기
문제 1
Luke와 다스베이더의 전화번호 찾기
답변 1
?는 '있거나 없거나'라는 뜻입니다.
따라서 -?는 -가 있거나 없다를 의미합니다. 따라서 이를 연속하는 숫자는 \d+와 조합하면 전화번호를 찾는 정규표현식을 만들 수 있습니다.
\d+-?\d+-?\d+
답변 2
\d{2,3}[- ]?\d{3,4}[- ]?\d{4}
http://www.nextree.co.kr/p4327/ https://programmers.co.kr/learn/courses/11/
'Dev' 카테고리의 다른 글
2019년도 높은 연봉을 받는 15가지 IT 자격증 (0) | 2019.02.17 |
---|---|
JDK 유료화 이슈 OpenJDK 링크 (0) | 2019.01.26 |
ShareX 사용법 (0) | 2019.01.21 |
Typora 시작하기 (0) | 2019.01.18 |
정규표현식이란? (0) | 2019.01.16 |