~~NOCACHE~~ ~~REVEAL night~~ ---- https://goo.gl/oNpyLA?.png bg-zoom slide slow ---->> # 정규표현식 ## 정규표현식의 사전적인 의미 특정한 규칙을 가진\\ **문자열의 집합**을 표현하는데 사용하는\\ **형식 언어** ---- https://goo.gl/R1cQZo?.png bg-zoom slide slow ----> ## 정규표현식 사용해보기 # 따옴표(')로 둘러쌓인 부분에 원하는 정규표현식을 적습니다. regex = r'0\d{1,2}[ -]?\d{3,4}[ -]?\d{3,4}' # 전화번호를 찾는 정규표현식 # 주소록입니다. 이후 강의에서 모두 이 search_target을 사용합니다. 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)) 결과 ``` 02-123-4567 070-9999-9999 010 2454 3457 ``` 출처: https://programmers.co.kr/learn/courses/11 ---- https://goo.gl/diUgLg?.png bg-zoom slide slow ----> # http://repl.it/ 실습은 이곳에서 진행합니다. > REPL : Read-Eval-Print Loop의 약자로 스칼라, 파이썬 등 대화형 환경 > > 콘솔에서 컴파일 없이 코드를 입력하고 출력 결과를 확인 할 수 있는 환경 ---- https://goo.gl/diUgLg?.png bg-zoom slide slow ----> **Python3**을 선택합니다.{{ https://goo.gl/vWhg5j}} 실행화면 {{ https://goo.gl/4XLb32 }} ---- https://goo.gl/c5DKSv?.png bg-zoom slide slow ----> ## 구성요소 - 메타 문자 - 이스케이프 문자 - 특수 문자 - 괄호 (대괄호, 중괄호, 소괄호) ---- https://goo.gl/qdF1iK?.png bg-zoom slide slow ---->> ## 메타 문자 . (dot) : 숫자와 문자 특수기호, 공백 등을 포괄한 **모든 범위의 한 글자** {{ https://goo.gl/SotRqm}} ^ (circumflex) : 문자열의 시작점. 그러나 일반적으로는 **한 줄의 시작점**을 의미한다. 문자클래스 집합에서는 다른 의미를 갖는다.{{ https://goo.gl/mcyQB7}} $ (dollar) : 문자열의 끝점. 그러나 일반적으로는 **한 줄의 끝점**을 의미한다.{{ https://goo.gl/UegnzB}} \ (back slash) : 메타문자를 검색하기 위하여 특수문자 앞에 사용한다. 마침표 `.` 를 찾기 위해 `\.` 을 사용한다. | (vertical bar) : '**또는**'을 의미한다. (고구려|백제|신라) 를 찾으면 고구려 또는 백제, 신라를 찾게 된다. ---- https://goo.gl/EUwNxG?.png bg-zoom slide slow ---->> ## 이스케이프 문자 `\w` : 영문자와 숫자, 언더스코어(_) {{ https://goo.gl/dgkxYA}} `\W` : 영문자와 숫자, 언더스코어(_)가 아닌 문자 {{ https://goo.gl/ZMfpWx}} `\d` : 10진수로 된 숫자 {{ https://goo.gl/1Sj781}} `\D` : 10진수 숫자 가 아닌 모든 문자(공백 포함) {{ https://goo.gl/o3X3Fe}} `\s` : 탭, 줄바꿈 등 지정된 공백문자[\t\n\r\f\v] {{ https://goo.gl/RV8cac}} `\S` : 위 공백문자가 아닌 모든 글자 {{ https://goo.gl/N7SHTb}} `\t` : 일반적으로 탭(TAB) 키를 입력했을 때 나오는 일정 간격을 유지하는 공백 {{ https://goo.gl/YcDejH}} ---- https://goo.gl/fQQXU1?.png bg-zoom slide slow ----> ## 글자 대표문자 \w ``` # 따옴표(')로 둘러쌓인 부분에 원하는 정규표현식을 적습니다. regex = r'\w' 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)) ``` 결과 ``` L u k e S k y w a r k e r 0 2 1 2 .. 이하 생략 .. ``` ---- https://goo.gl/uo3Vzo?.png bg-zoom slide slow ----> ## 숫자 대표문자 \d ```python # 따옴표(')로 둘러쌓인 부분에 원하는 정규표현식을 적습니다. regex = r'\d' # 주소록입니다. 이후 강의에서 모두 이 search_target을 사용합니다. 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)) ``` 결과 ```python 0 2 1 2 3 4 5 6 7 0 7 0 9 9 9 9 9 .. 이하 생략 .. ``` ---- https://goo.gl/WVzZkX?.png bg-zoom slide slow ---->> ## 특수 문자 ? : 문자가 없거나 하나인 경우 {{ https://goo.gl/SotRqm}} * : 문자가 없거나 하나 이상 존재하는 경우 {{ https://goo.gl/SotRqm}} + : 문자가 하나 이상 존재하는 경우 {{ https://goo.gl/SotRqm}} ---- https://goo.gl/eccY3q?.png bg-zoom slide slow ----> ## 하나 이상 + ```python #regex에는 넣는 값 중, 따옴표(')로 둘러쌓인 부분에 원하는 정규표현식을 적습니다. 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(result) ``` 결과 ```python ['02', '123', '4567', '070', '9999', '9999', '010', '2454', '3457'] ``` ---- https://goo.gl/oNpyLA?.png bg-zoom slide slow ---->> ## 대괄호: 문자 클래스의 집합 > 문자 클래스란 문자열, 특수문자 등을 등장할 수 있는 형태를 표시한 것 `[0-9]` : 0부터 9까지의 숫자 집합을 의미 {{ https://goo.gl/Lgcker}} `[A-Z]` : 영어 대문자 집합 {{ https://goo.gl/x9etG3}} `[AEIOUaeiou]` : 영어에서 a, e, i, o, u로 이루어진 대소문자 집합 {{ https://goo.gl/9773v3}} `[가-힣]` : 가부터 힣까지의, 한글자모부분을 제외한 한글 집합 {{ https://goo.gl/9dR2DL}} ---- https://goo.gl/R1cQZo?.png bg-zoom slide slow ----> ## 대괄호: 문자 클래스의 집합 > 대괄호 내에 ^가 들어가면 ^ 뒤에 나오는 문자 클래스는 해당 집합에서 제외한다는 의미 `[^0-9]` : 0부터 9까지의 숫자 집합을 제외한다는 의미이며, 이스케이프 문자 \D와 동일한 의미 {{ https://goo.gl/UQT5CN}} `^[^A-Z]` : 행의 앞쪽이 영어 대문자 집합인 것을 제외하고 찾으라는 의미 {{ https://goo.gl/8gLbnp}} `[0-9+\-*/\^\(\)=]` : 숫자와 사칙연산 부호 등(+, -, *, /, ^, \=\)을 찾으라는 의미 {{ https://goo.gl/He9CmC}} ---- https://goo.gl/diUgLg?.png bg-zoom slide slow ----> ## 중괄호: 수량자 > 수량자 앞의 글자 혹은 문자클래스 집합의 글자수가 얼마나 되는지를 지정하는 것 `[0-9]{5}` : 5자리의 숫자 집합 {{ https://goo.gl/3mgKjK}} `[A-Za-z]{3,}` : 3글자 이상의 영어 단어 집합 {{ https://goo.gl/HD6pCt}} `[A-Za-z0-9]{4,8}` : 4글자 이상 8글자 이하의 영어 대소문자와 숫자로 이루어진 집합 {{ https://goo.gl/kNseMp}} ---- https://goo.gl/diUgLg?.png bg-zoom slide slow ----> ## 수량자 & 특수문자 ^ 특수문자 ^ 대응수량자 ^ 설명 ^ | ? | {0,1} | 문자가 없거나 하나인 경우 | | * | {0,} | 문자가 없거나 하나 이상 존재하는 경우 | | + | {1,} | 문자가 하나 이상 존재하는 경우 | ---- https://goo.gl/c5DKSv?.png bg-zoom slide slow ----> ## 게으른 수량자 ? `.+` : 한 줄을 의미 {{ https://goo.gl/wMvgME}} `.+?` : \.와 동일한 결과를 가져온다. {{ https://goo.gl/v7mkiC}} `.{3,}` : 3글자 이상의 한 줄 {{ https://goo.gl/YDbi8F}} `.{3,}?` : 한 줄을 3글자 단위로 끊은 결과를 보여준다. {{ https://goo.gl/WJPUJD}} ---- https://goo.gl/fQQXU1?.png bg-zoom slide slow ----> ## 소괄호: 그룹 예제문단 ``` 충청남도를 충청남도라고 한다. 옳다. 충청북도를 충청남도라고 한다. 잘못되었다. 충청도를 충청남도라고 한다. 역시 잘못되었다. ``` `충청(남|북)?도` : 충청남도, 충청북도, 충청도를 의미 {{ https://goo.gl/xHvxbG}} `(충청(남|북)?도)를 \1` : 위에서 찾은 단어들을 하위 표현식으로 묶어서 역참조에 활용한 것이다. 이 경우 **첫째 줄부분**만이 검색된다. {{ https://goo.gl/R2Qet4}} 출처: https://librewiki.net/wiki/정규표현식 ---- https://goo.gl/WVzZkX?.png bg-zoom slide slow ---->> ## 사용예시 URL 문자열에서 **URL**을 찾는 정규표현식의 예제 ```python (http|https|ftp|telnet|news|mms)://[^\"'\s()]+ ``` ### (http|https|ftp|telnet|news|mms)://[^\"'\s()]+ ---- https://goo.gl/eccY3q?.png bg-zoom slide slow ----> ## 사용예시 - 이메일 웹사이트의 회원가입절차에서 이메일 주소 폼에 **이메일**을 제대로 입력했는지 검증 ```python ^[0-9a-zA-Z]([\-.\w]*[0-9a-zA-Z\-_+])*@([0-9a-zA-Z][\-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9}$ ``` ### ^[0-9a-zA-Z]([\-.\w]*[0-9a-zA-Z\-_+])*@([0-9a-zA-Z][\-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9}$ {{ https://goo.gl/86poyd }} ---- https://i.ytimg.com/vi/9HMzwFl5OLY/maxresdefault.jpg bg-zoom slide slow ----> # 감사합니다. > (들어주셔서)?\s(정말)+\s((감사|사랑)합|고맙습)니다.? {{ https://goo.gl/uBb5gj }} ---- https://goo.gl/R1cQZo?.png bg-zoom slide slow ----> 출처 - https://librewiki.net/wiki/정규표현식 - http://www.nextree.co.kr/p4327/ - https://regexper.com - https://programmers.co.kr/learn/courses/11/ 이메일: **jykwon@wavus.co.kr**