~~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**