내용
정규식(Regular Expression, RE)
python 주요 메소드와 주요 함수
정규식은 특정한 패턴을 가진 문자열을 표현하기 위한 표현식(expression)으로 특정 규칙의 텍스트를 검색하거나 치환하기 위해 사용합니다. 즉, 여러개의 문자를 표현하거나 패턴을 찾기 위한 특수한 심벌들과 문자들을 이용하는 문자열입니다. 정규표현식은 간단히 정규식 또는 regex로 나타냅니다.
python 라이브러리 re
모듈을 사용합니다. 패턴과 검색할 문자열은 유니코드 문자열과 8 bit 문자열이 될 수 있습니다. 그러나 상호간의 검색과 패턴을 검사할 수 없습니다. 즉, 치환 또는 검색문자(열)와 대상 문자열은 동일한 형이어야 합니다.
모듈 re에서 일치하는 문자열을 찾기 위한 기본적인 메소드들은 다음과 같습니다.
메소드 | 내용 |
---|---|
obj=re.compile(x) | 검색할 대상인 x를 정규식 객체로 변환합니다. 즉, 파이썬 인식할 수 있는 개체로 인코딩합니다. |
obj.search(y) | 검색할 대상인 x를 y에서 검색합니다. 최초로 매칭된 결과만을 객체의 인덱스 구간과 문자를 반환 |
obj.findall(y) | 검색할 대상인 x를 y에서 검색합니다. 매칭된 모든 결과를 리스트 형식으로 반환 |
결과.group() | search()등의 메서드를 적용한 결과 중 매칭된 문자만을 반환하기 위해 사용 |
import re
txt="""행복을 추구하는 우리 삶의 많은 부분은 경제적 의사결정과 밀접하게 관련되어 있습니다. 우리는 일상생활에서 의사결정을 계속하지 않을 수 없 습니다. """ trg=re.compile("결정") result=trg.search(txt) result
<re.Match object; span=(28, 30), match='결정'>
result.group()
'결정'
trg.findall(txt)
['결정', '결정']
위의 기본적인 메소드는 함수와 동일한 이름을 갖습니다. 다음은 정규식을 사용할 수 있는 다양한 함수들입니다.
함수 | 내용 |
---|---|
compile(pattern) | 주어진 pattern을 컴파일 하여 정규식 객체를 반환 |
match(pattern, string) | 주어진 string의 시작부분에 해당 pattern이 존재하는지 검사하여 매치되는 객체를 반환 |
search(pattern, string) | 주어진 string의 전체부분에 해당 pattern이 존재하는지 검사하여 처음으로 매치되는 부분을 반환 |
split(pattern, string) | 주어진 pattern을 기준으로 string을 분리하여 리스트로 반환 |
findall(pattern, string) | 주어진 string에서 pattern을 만족하는 문자열을 찾아 리스트로 반환 |
sub(pattern, repl, string) | string에서 pattern 부분을 repl로 대체하여 문자열을 반환 |
subn(pattern, repl, string) | sub() 함수와 동일 하지만 결과로 (결과문자열, 매칭횟수)를 튜플로 반환 |
escape(string) | 영문자나 숫자를 제외한 문자들을 백슬러시로 지정해서 리턴 |
txt="The beautiful sky in october" x=re.search("e", txt) x
<re.Match object; span=(2, 3), match='e'>
re.match("e", txt)
print(re.match("e", txt))
None
re.match("T", txt)
<re.Match object; span=(0, 1), match='T'>
re.split("e", txt)
['Th', ' b', 'autiful sky in octob', 'r']
re.findall("e", txt)
['e', 'e', 'e']
re.sub("e", '0', txt)
'Th0 b0autiful sky in octob0r'
re.subn("e", '0', txt)
('Th0 b0autiful sky in octob0r', 3)
re.escape(txt)
'The\\ beautiful\\ sky\\ in\\ october'
정규식의 기호
대상이 되는 문자열의 검색을 위해 문자(열)에 일정한 규칙(패턴)을 지정합니다. 기본적으로 정규식에서는 대소문자를 구분하고 빈칸을 인식합니다.
text="Hello, hello, World" regex=re.compile("Hello") regex.findall(text)
['Hello']
txt="경제적으로 윤택한 것도 행 복한 삶의 여러가지 조건 중 하나" re.search("행복", txt)
re.search("행 복", txt)
<re.Match object; span=(13, 16), match='행 복'>
그 외에 여러가지 형태의 패턴을 인식하기 위해 사용하는 다양한 기호들이 존재합니다.
정규식 | 설명 |
---|---|
. | 임의의 한 문자가 존재 |
? | ? 앞의 문자(열) 중 존재하는 문자 검색 |
* | * 앞의 문자(열)가 존재여부 예) abc* → abc 또는 ab 또는 a 검색 |
+ | 바로 앞의 문자(열)의 존재를 검색 예) abc+ → abc 검색 |
^ | 바로 뒤의 문자로 문자열이 시작 예) ^x: 검색하는 전체 대상이 x로 시작 |
$ | 바로 앞의 문자로 문자열이 끝남 예)x$: 검색하는 전체 대상이 x로 끝남 |
문자(열){숫자} | 문자(열)이 숫자만큼 반복 |
문자(열){숫자,} | 문자(열)이 숫자 이상 만큼 반복 |
문자(열){숫자1, 숫자2} | 문자(열)이 숫자1 이상, 숫자 2 이하만큼 반복 |
(문자열) | 문자나 문자열을 묶음 |
문자(열)1 | 문자(열)2 | 문자(열)1 이나 문자(열)2를 검색 |
[문자1, 문자2, ...] | 대괄호 안의 문자들이 존재하는지 검색 |
[^] | '^' 기호 바로 뒤의 문자가 존재하지 않음 |
[:alpha:] | 알파벳만 검색 |
[:alnum:] | 알파벳, 숫자 검색 |
[:digit:] | 숫자만 검색 |
[:upper:] | 대문자만 검색 |
\ | (역슬래시) 글자 자체를 검색 |
\d | 모든 숫자를 검색, [0-9]와 동일 |
\D | 숫자를 제외한 모든 문자를 검색 [^0-9] |
\s | 공백을 검색 |
\S | 공백이 아닌 문자를 검색 |
\A문자(열) | 대상이 문자(열) 시작 |
\w | 숫자 또는 문자를 검색 [a-zA-Z0-9] |
\W | 숫자 또는 문자가 아닌 것을 검색 |
\Z | 지정된 문자로 끝나면 그 문자를 반환 |
\b문자 | 지정된 문자가 단어의 시작 또는 끝에 있는 존재여부를 검색 |
\B문자 | 지정된 문자가 문자열의 시작과 끝이 아닌 위치에 있는 경우 반환 |
- .
- 임의의 한 문자
import re r=re.compile("a.c") #.은 임의의 한문자 r.search("avc") #a와 c사이에 한개의 문자 존재
<re.Match object; span=(0, 3), match='avc'>
- ?
- 기호 앞의 문자가 존재여부에 관계없이 기호 뒤의 문자는 반드시 존재해야 됨
r.search('ac')#a와 c사이에 문자가 존재하지 않으므로 결과없음
txt="hello world" re.search("h.", txt) #h 다음에 임의의 한 문자
<re.Match object; span=(0, 2), match='he'>
re.search("h..", txt) #h 다음에 임의의 두 문자
<re.Match object; span=(0, 3), match='hel'>
txt="Sensibility of October's clear sky and rainy sky " re.findall("[clear]", txt)#대괄호내의 각 문자를 검색
['e', 'l', 'c', 'e', 'r', 'c', 'l', 'e', 'a', 'r', 'a', 'r', 'a']
re.findall("clear", txt) #=re.findall("(clear)", txt) 문자열을 검색
['clear']
txt = "symbols for start and end" re.findall('^sy', txt) #sy로 시작되는 문자를 지정함
['sy']
r=re.compile("d$") r.search(txt) #검색 대상이 'd'로 끝남
<re.Match object; span=(24, 25), match='d'>
txt = "The rain in Spain falls mainly in a pln!" re.search('ai+', txt) #+ 앞에 검색 대상 문자
<re.Match object; span=(5, 7), match='ai'>
re.findall('ai+', txt)
['ai', 'ai', 'ai']
re.findall('aix+', txt)
[]
re.findall('aix?', txt)
['ai', 'ai', 'ai']
re.findall('aix*', txt)
['ai', 'ai', 'ai']
txt = "The rain in Spain falls mainly in the plain!" re.findall('al{2}', txt)
['all']
re.findall('a{2}', txt)
[]
txt="Sensibility of October's clear sky and rainy sky " re.findall("clear|cloudy", txt)
['clear']
txt = "59 dollars" #모든 숫자 re.findall('\d', txt)
['5', '9']
txt = "59 dollars" #숫자를 제외한 모든 문자 re.findall('\D', txt)
[' ', 'd', 'o', 'l', 'l', 'a', 'r', 's']
re.findall('\s', txt) #공백검색
[' ']
re.findall('\S', txt) #공백이 아닌 문자, 숫자 검색
['5', '9', 'd', 'o', 'l', 'l', 'a', 'r', 's']
txt="hello world_20" re.findall("\w", txt)
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '_', '2', '0']
re.findall("\W", txt)
[' ']
백스페이스(\)는 다음에 오는 문자 자체를 검색합니다. \문자를 검색에서 제외하기 위해서는 "\\문자 검색대상" 또는 r"\문자검색대상"과 같이 실행합니다. 이 경우 r은 "raw string(원시문자열)"을 의미합니다. 다음 코드에서 \b가 단순히 문자 b가 아니고 정규식 코드임을 나타내기 위해 r"\b--" 또는 "\\b--"
의 형식으로 코드를 구성합니다.
txt="Sensibility of October's clear sky and rainy sky " re.findall(r"\bSen", txt)
['Sen']
re.findall("\\bSen", txt)
['Sen']
re.findall("\bSen", txt)
[]
re.findall(r"ky\b", txt)
['ky', 'ky']
re.findall("\\Bto", txt)
['to']
re.findall(r"\Bto", txt)
['to']
'\'기호를 탈출문자(escape character)라고 하는데 이는 문자의 원래의 의미를 없애고 단지 문자열의 한 요소로 취급하기 때문입니다. 빈번히 사용되는 escape character는 다음과 같습니다.
Escape character | 설명 |
---|---|
\n | 줄바꿈(개행) |
\v | 수직탭 |
\t | 수평탭 |
\r | 캐리지리턴 |
\f | 폼 피드 |
\a | 벨 소리 |
\b | 벨 소리 |
\000 | 널문자 |
\ | 문자 " " |
' | 단일 인용부호(') |
" | 이중 인용부호(") |
댓글
댓글 쓰기