[Python] 정규표현식 기본 re :: regular expression
라이브러리 불러오기
import re
메타문자
[ ] |
문자클래스 |
[ ] 사이의 문자들과 매치 |
- |
[From - To] |
ex) [a-zA-Z] = 알파벳 모두 [0-9] = 모든 숫자
|
\d |
숫자 |
= [0-9] |
\D | 숫자가 아닌 것 |
= [^0-9] |
\s | 공백 |
= [ \n\t\r\f\v] |
\S | 공백이 아닌 것 |
= [^ \n\t\r\f\v] |
\w | 문자+숫자+_ |
= [a-zA-Z0-9_] |
\W | 문자+숫자+_가 아닌 것 |
=[^a-zA-Z0-9_] |
\ |
이스케이프 \와 함께 사용하면 일반 문자로 인식된다. |
|
. |
\n를 제외한 모든 문자 |
. = 모든 문자 |
[.] |
[]안에 .을 넣을 경우 그냥 '.'으로 인식 |
[.] = 온점. |
| |
or |
|
^ |
[] 바깥에 있을 경우 문자열의 시작과 매치 re.MULTILINE과 함께 쓰인다면 각 줄의 첫 문자와 일치 |
ex) |
[^] |
[] 안에 있을 경우 [] 안의 정규표현식을 부정(not)한다. |
ex) |
$ |
문자열의 끝과 매치 re.MULTILINE과 함께 쓰인다면 각 줄의 끝 문자와 일치 |
|
* | 반복 (0 ~ ∞) |
ex) mizy* = miz / mizy / mizyyyyy |
+ | 반복 (1 ~ ∞) |
ex) mizy+ = mizy / mizyy |
? | 있어도 되고 없어도 된다. (0 또는 1) |
ex) miz?y = miy / mizy |
{m} | m번 반복 |
ex) mizy{3} = mizyyy |
{x, y} | x ~ y번 반복 |
ex) mizy{2, 4} = mizyy / mizyyy |
정규식 컴파일
re.compile을 이용하여 정규식을 컴파일한다.
import re
com = re.compile()
컴파일 옵션
정규식을 컴파일할 때 옵션을 지정할 수 있다.
re.DOTALL 또는 re.S | 모든 문자와 매치 |
re.IGNORECASE 또는 re.I | 대소문자 구분 x |
re.MULTILINE 또는 re.M | 여러줄과 매치 |
re.VERBOSE 또는 re.X | verbose 모드 사용 |
re.compile('Let's start!', re.I) = re.compile('Let's start!', re.DOTALL)
문자열 검색 & 치환
match() | 문자의 처음부터 정규식과 매치되는지 검색 |
search() | 문자 전체에서 정규식과 매치되는 부분이 있는지 검색 |
findall() | 정규식과 매치되는 모든 문자를 찾아 리스트로 반환 |
finditer() | 정규식과 매치되는 모든 문자를 반복가능한 객체로 반환 |
sub() | 정규식과 매치되는 부분을 치환 |
[]
[] 안에 들어있는 모든 문자와 매치된다. 단어로 인식되지 않고 문자열 하나하나로 매치된다.
com = re.compile('[apple]')
com.findall('I ate apple.')
['a', 'e', 'a', 'p', 'p', 'l', 'e']
-
From-To. []와 함께 사용하여 From 부터 ~ To 까지로 활용된다.
com = re.compile('[1-3]')
com.findall('123456789')
['1', '2', '3']
→ 숫자 전체를 나타내고 싶으면 [0-9]
com = re.compile('[a-e]')
com.findall('abcdefghijklmn')
['a', 'b', 'c', 'd', 'e']
→ 영문 전체를 나타내고 싶으면 [a-zA-Z]
\d \D \w \W \s \S
숫자 전체, 문자 전체, 공백을 표현하는 방법이다.
\d = 숫자
# 숫자
com = re.compile('\d')
com.findall('I am 30 years old!')
['3', '0']
\D = 숫자가 아닌 것
# 숫자가 아닌 것
com = re.compile('\D')
com.findall('I am 30 years old!')
['I', ' ', 'a', 'm', ' ', ' ', 'y', 'e', 'a', 'r', 's', ' ', 'o', 'l', 'd', '!']
\w = 문자
# 문자(문자, 숫자, _)
com = re.compile('\w')
com.findall('I am 30 years old!')
['I', 'a', 'm', '3', '0', 'y', 'e', 'a', 'r', 's', 'o', 'l', 'd']
\W = 문자가 아닌 것
# 문자가 아닌 것
com = re.compile('\W')
com.findall('I am 30 years old!')
[' ', ' ', ' ', ' ', '!']
\s = 공백
# 공백
com = re.compile('\s')
com.findall('I am 30 years old!')
[' ', ' ', ' ', ' ']
\S = 공백이 아닌 것
# 공백이 아닌 것(문자, 특수문자, 숫자)
com = re.compile('\S')
com.findall('I am 30 years old!')
['I', 'a', 'm', '3', '0', 'y', 'e', 'a', 'r', 's', 'o', 'l', 'd', '!']
.
[] 바깥에 있을 때는 \n을 제외한 모든 문자와 매치
[] 안에 .을 넣으면 문자열 '.'만 인식/p>
# 모든 문자
com = re.compile('.')
com.findall('a2@.')
['a', '2', '@', '.']
# 온점
com = re.compile('[.]')
com.findall('a2@.')
['.']
^
[] 밖에 있을 때는 문자열의 시작과 매치
[] 안에 있을 때는 부정(not)
# ^ 문자열의 시작
com = re.compile('^choco')
com.findall('choco cake')
[choco]
→ 정규표현식이 문자열의 시작점에 있을 경우에만 인식된다.
# ^ 문자열의 시작
com = re.compile('^choco')
com.findall('ice choco')
[]
→ 시작점 이외에 해당 문자가 있으면 인식되지 않는다.
# ^ 문자열의 시작
com = re.compile('^choco', re.MULTILINE)
com.findall('''choco cake.
choco latte''')
['choco', 'choco']
→ re.MULTILINE(혹은 re.X)을 이용하여 여러줄로 만들었을 때는 라인의 첫 문자들과 일치한다. 만약 re.MULTILINE을 사용하지 않았다면 출력될 결과는 [choco]이다.
# [^] 부정 not
com = re.compile('[^\d]')
com.findall('abc123')
'a', 'b', 'c']
→ [] 안에 ^이 있으면 부정(not)을 의미한다. 따라서 \d(숫자)가 아닌 것을 인식하였다.
$
문자열의 끝과 매치
# $ 문자열의 끝
com = re.compile('choco$')
com.findall('ice choco')
['choco']
→ 문자열의 끝에 있을 때만 일치한다.
# $ 문자열의 끝
com = re.compile('choco$')
com.findall('choco cake')
→ 문자열의 끝이 아닌 곳에 있을 때는 인식되지 않는다.
# $ 문자열의 끝
com = re.compile('choco$', re.MULTILINE)
com.findall('''ice choco
white choco''')
['choco', 'choco']
→ re.MULTILINE(혹은 re.X)을 이용하여 여러줄로 만들었을 때는 라인의 마지막 문자들과 일치한다. 만약 re.MULTILINE을 사용하지 않았다면 출력될 결과는 [choco]이다.
*
반복 (0 ~ ∞)
com = re.compile('mizy*')
com.findall('miz')
['miz']
com = re.compile('mizy*')
com.findall('mizyyyy')
['mizyyyy']
+
반복 (1 ~ ∞)
com = re.compile('mizy+')
com.findall('miz')
[]
com = re.compile('mizy+')
com.findall('mizyyyy')
['mizyyyy']
?
있어도 되고 없어도 된다. (0 또는 1)
com = re.compile('mizy?')
com.findall('miz')
['miz']
com = re.compile('mizy?')
com.findall('mizyyy')
['mizy']
{m}
m번 반복
com = re.compile('mizy{3}')
com.findall('mizyyyyyyyyy')
['mizyyy']
{x, y}
x ~ y번 반복
com = re.compile('miz{3,5}y')
com.findall('mizy mizzzy mizzzzzy mizzzzzzzy')
['mizzzy', 'mizzzzzy']
\
이스케이프. 메타문자가 아닌 일반 문자열로 나타내고 싶을 때 이스케이프를 사용한다.
com = re.compile('[mizy]')
com.findall('[mizy]')
['m', 'i', 'z', 'y']
com = re.compile('\[mizy\]')
com.findall('[mizy]')
['[mizy]']
→ 이스케이프를 사용하지 않으면 []를 표현식으로 인식한다. 하지만 \를 이용하면 붙여주면 아무 기능이 없는 문자로 인식된다.
'Python > 기타' 카테고리의 다른 글
[Python] Multiprocessing을 이용한 반복문 속도개선 (0) | 2020.06.08 |
---|---|
[chardet] 파일 인코딩을 무엇으로 지정할지 모를 때 :: Encoding Error , Encoding Detector (0) | 2020.05.06 |
[Python] 정규성 검정 :: 히스토그램, Q-Q Plot (2) | 2020.04.07 |
[Python] 예외처리 :: try~except (0) | 2020.04.06 |
[Python] 쥬피터 노트북 경고(warnings)가 나오지 않게 하는 법 (0) | 2020.03.20 |
Comments