본문 바로가기

[Python] 정규표현식 기본 re :: regular expression

Python/기타 2020. 4. 17.

반응형

라이브러리 불러오기

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)
^a = a로 시작하는

[^]

[] 안에 있을 경우 [] 안의 정규표현식을 부정(not)한다.

ex)
[^123] = 123이 아닌 것

$

문자열의 끝과 매치

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]']

→ 이스케이프를 사용하지 않으면 []를 표현식으로 인식한다. 하지만 \를 이용하면 붙여주면 아무 기능이 없는 문자로 인식된다.

 

 

 

Reference

728x90

Comments