Python 정규 표현식으로 추출 방법

파이썬 정규 표현식 사용방법과 예제입니다.

 

 초기 설정

정규 표현식을 사용하기 위해서는 라이브러리를 설정해야 합니다.

import re

 

정규 표현식을 사용하는 방법으로 2가지가 있습니다.

첫 번째는 검색할 패턴을 컴파일해두는 방법입니다.

이 방법은 같은 문자를 여러 번 검색하는 경우에 사용하는 방법으로, 매번 검색 패턴을 지정하지 않아도 되기 때문에 검색 속도가 빠릅니다.

 

compile

pattern = r"ca"
text = "caabsacasca"
repatter = re.compile(pattern)
matchOB = repatter.match(text)

 

다른 하나는 컴파일을 하지 않고 검색할 때마다 패턴을 설정하는 방법입니다.

이러한 경우는 검색할 패턴이 매번 다른 경우에 사용하는 경우가 많습니다.

 

NoCompile

pattern = r"ca"
text = "caabsacasca"
matchOB = re.match(pattern , text)

 

검색 패턴에 r을 붙여서 사용하는 것이 편리합니다.

붙이지 않아도 동작은 하지만 raw문자인 r을 붙이는 것으로 문자열 안에 있는 백슬러시 문자를 특수한 의미를 가진(에스케이프) 문자가 아닌 백슬러시 문자 그대로 인식되기 때문입니다.

 

검색 방법

검색에는 크게 4가지가 있습니다.

메서드내용
 match(pattern, string) 문자열의 시작부분부터 매칭이 되는지 검색.
 search(pattern, string) 문자열에 패턴과 매칭되는 곳이 있는지 검색.
 findall(pattern, string) 정규식과 매치되는 모든 문자열을 리스트로 반환.
 finditer(pattern, string) 정규식과 매치되는 모든 문자열을 iterator 객체로 반환.

  

match() 함수

문자열의 시작 부분부터 패턴과 매칭이 되는지 검색하는 함수입니다.

검색 결과는 matchObject 인스턴트로 반환됩니다.

반환된 오브젝트에서 매칭 된 부분을 추출하려면 group함수를 사용합니다.

pattern = r"ca"
text = "caabsacasca"
matchOB = re.match(pattern , text)
if matchOB:
	print matchOB.group() # 'ca'

 

정보 추출 함수

메서드내용
 group() 매칭된 문자열.
 start() 매칭된 문자열 시작 위치.
 end() 매칭된 문자열 종료 위치.
 span() 매칭된 문자열 시작과 종료위치를 튜플로 반환.

 

 search() 함수

문자열에 패턴과 매칭 되는 부분이 있는지 검색하는 함수.

match() 함수와 차이점은 검색 대상 문자열의 시작 부분이 매칭되지 않아도 검색을 진행합니다.

그리고 여러 개 매칭이 되더라고 처음에 검색된 부분을 반환합니다.

 

match와 search차이

textaaa aaaBBaaaBBB
 re.match(r’aaa’, text) ○ ○ ✗ ✗
 re.search(r’aaa’, text) ○ ○ ○ ✗

 

search

pattern = r"ca"
text = "caabsacasca"
matchOB = re.search(pattern , text)

if matchOB:
	print matchOB
	print matchOB.group() # 매칭된 문자열 # ca
	print matchOB.start() # 매칭된 문자열 시작 위치 # 0
	print matchOB.end()   # 매칭된 문자열 종료 위치 # 2
	print matchOB.span()  # 매칭된 문자열 시작,종료 위치 # (0, 2)

 

 

 findall() 함수

문자열에 패턴과 매칭 되는 부분을 리스트로 전부 반환합니다.

단, 반환 값이 matchObject가 아니기 때문에 group() 함수 등을 사용할 수 없습니다.

pattern = r"ca"
text = "caabsacasca"
# 매칭된 값은 리스트로 모두 반환
matchedList = re.findall(pattern,text)
if matchedList:
	print matchedList # ['ca', 'ca']

   

finditer() 함수

문자열에 패턴과 매칭 되는 부분을 이터레이터로 반환합니다.

반환 값을 for문을 사용하여 모두 추출할수 있습니다.

findall 함수는 리스트를 반환하지만 finditer 함수는 오브젝트 형태로 된 이터레이터를 반환하기 때문에 for문내에서 group() 함수 등을 사용할 수 있습니다.

pattern = r"ca"
text = "caabsacasca"
# 매칭된 값은 이터레이터로 모두 반환
iterator = re.finditer(pattern ,text)
for match in iterator:
	print match.group() # 1回目: ca 2回目: ca 
	print match.start() # 1回目: 0 2回目: 6 
	print match.end() # 1回目: 2 2回目: 8 
	print match.span() # 1回目: (0, 2) 2回目: (6, 8)

 

정규 표현식 속성

Perl 등 정규 표현식에 검색 패턴 뒤에 속성을 설정할 수 있습니다.

예를 들어 /pattern/i 라고 i를 설정하면 대소문자 구분을 하지 않고 검색하게 됩니다.

파이썬에서는 다음처럼 사용 가능합니다.

pattern = r"avSCSA"
text = "AVscsa"

#compile
#대소문자 구분 안함
repatter = re.compile(pattern, re.IGNORECASE)
matchOB = repatter.match(text)

#NoCompile
#대소문자 구분 안함
matchOB = re.match(pattern , text, re.IGNORECASE)

if matchOB:
	find = re.finditer(pattern , text, re.IGNORECASE)
	for f in find:
		print f.group()# AVscsa
		print f.start()# 0
		print f.end() # 6
		print f.span() # 0, 6

댓글