re 모듈을 사용하여 다양한 문자열 패턴을 만들 수 있다. 함수를 사용하는 것처럼 테크닉이 많이 필요하니 이론보다는 코드에 집중하면 빠르게 습득할 수 있다.

 

* 파이프

 

| 파이프로 OR 조건처럼 사용할 수 있다. 제일 처음에 나오는 문자열을 정규식 객체로 리턴한다.

 

아래는 세개의 단어를 컴파일한다. 문자열에 세 개의 단어중 하나를 찾아서 돌려준다. 앞쪽부터 하나만 반환한다.

 

import re

regex = re.compile(r'apple|orange|kiwi')
mo1 = regex.search('I have an apple and 3 orange and 5 kiwi')
print(mo1.group())

mo2 = regex.search('My favorite is a cup of orange juice after '
                   'lunch. I do not like apple that much')
print(mo2.group())

mo3 = regex.search('everyone loves kiwi. it has special taste. '
                   'one apple after mango')
print(mo3.group())

* 다양한 패턴 만들기, Search 메소드 <?, *>

 

좀 더 다양한 패턴을 만들어 볼 수가 있다. 파이썬이니까 좀 더 직관적인 방식으로 여러가지를 시도해보면 원리를 깨닫는데 도움이 된다. 파이썬의 원리을 이해하려면 실전 코딩이 중요하다.

 

정규식은 직관적으로 사용이 가능하지만 복잡한 메커니즘이 들어있다. 인간의 문자열을 다루는 것은 기계어 작성에 비교하면 상당한 고차원 수준이다. 사람은 알기 쉬워도 기계가 작동하는 매커니즘을 사람이 들여다 보면 쉽지 않다. 반면 기계의 관점에서 CPU의 instruction 으로 따지면 일반 프로그래밍 제어보다 복잡하다.

 

import re

regex = re.compile(r'my( friend| girl friend| boy friend)')
mo1 = regex.search('this is my girl friend and my friend')
print(mo1.group())
mo1 = regex.search('this is my boy friend and my girl friend')
print(mo1.group())
mo1 = regex.search('this is my friend of mine and girl friend')
print(mo1.group())

my 다음에 공백이 하나 있고 다른 단어들이 나온다. 이 조건들을 추가하는 것은 어려운게 아니다. 단어를 다양한 문맥에 따라 선택할 수 있다는 것은 텍스트의 흐름을 컨트롤 할 수 있게 도와준다.

 

다음의 예제는 파일의 확장자를 선택한다. (괄호)의 오른쪽에 ? 물음표를 붙이면 (괄호 내용)이 없는 단어까지 찾아준다.

 

search 메소드는 항상 앞에서부터 검색한다는 점에 주의하자. 하나를 찾으면 반환하기 때문에, 다른 단어가 더 있어도 찾지 않는다.

 

import re

regex = re.compile(r'file(.exe|.jpg|.png|.txt)?')
mo1 = regex.search("my file.jpg your file.png")
print(mo1.group())

mo2 = regex.search("my file.exe your file.txt")
print(mo2.group())

mo3 = regex.search("my file is good")
print(mo3.group())

 

* 표시를 사용하면 0개 또는 그 이상과 일치 시킬 수 있다.

 

아래 코드를 보면 text 다음에 나오는 개수가 0개 이상이다. | 파이프 연산자로 중복해서 사용할 도 있다.

 

import re

regex = re.compile(r'text(1|2|3|4|5|6|7|8|9|0)*')
mo1 = regex.search("first text1111 built")
print(mo1.group())

mo2 = regex.search("text text125234 built")
print(mo2.group())

+ 표시는 *와 달리 1개 이상 match 해야 한다. search에서 단어를 찾지 못하면 None을 반환하는데, 거기서 group()메소드를 사용하면 오류가 발생한다. 오류를 방지하기 위해서 if 문으로 걸러준다.

 

import re

regex = re.compile(r'(다라)+')
mo1 = regex.search("가나다라마바사아")
if mo1 == None:
    print("찾는 문자가 없음 None returned")
else:
    print(mo1.group())

mo2 = regex.search("자차카파타하")
if mo2 == None:
    print("찾는 문자가 없음 None returned")
else:
    print(mo2.group())

 

(단어){숫자} 를 사용하면 특정 단어를 반복시킬 수 있다.

 

import re

regex = re.compile(r'(many ){2}')
mo1 = regex.search("There are many many interesting things in Seoul")
if mo1 == None:
    print("찾는 문자가 없음 None returned")
else:
    print(mo1.group())

mo2 = regex.search("many things happened")
if mo2 == None:
    print("찾는 문자가 없음 None returned")
else:
    print(mo2.group())

 

 

응용하면 아래와 같이 사용가능하다.

regex = re.compile(r'\d{3}')
mo1 = regex.search("hello and welcome 007")
if mo1 == None:
    print("찾는 문자가 없음 None returned")
else:
    print(mo1.group())

\d 숫자가 3회 나오는 패턴이다.

 

반복 횟수의 범위를 지정할 수도 있다. 아래 예제는 숫자 2개에서 5개까지 범위에서 찾는다.

import re

regex = re.compile(r'\d{2,5} dollars')
mo1 = regex.search("the price is 30 dollars")
if mo1 == None:
    print("찾는 문자가 없음 None returned")
else:
    print(mo1.group())

mo2 = regex.search("the price is 2000 dollars")
if mo2 == None:
    print("찾는 문자가 없음 None returned")
else:
    print(mo2.group())

 

최대 일치와 최소 일치를 구분할 수 있다. ? 물음표를 붙이면 최소 일치가 된다. 2개~5개 반복중에 2개를 기준으로 찾아서 반환한다. 2000을 넣으면 20 만 가져오고 나머지는 버려진다.

import re

regex = re.compile(r'\d{2,5}?')
mo1 = regex.search("the price is 30 dollars")
if mo1 == None:
    print("찾는 문자가 없음 None returned")
else:
    print(mo1.group())

mo2 = regex.search("the price is 2000 dollars")
if mo2 == None:
    print("찾는 문자가 없음 None returned")
else:
    print(mo2.group())

 

텍스트 패턴을 찾는 일은 많은 경우 퍼즐과 같다. 다양한 단어를 사용해서 연습이 필요하다.

공유하기

facebook twitter kakaoTalk kakaostory naver band