본문 바로가기
대학원 공부/programming language

Python : basic : 문자열 (re)

by 월곡동로봇팔 2019. 11. 22.

re, 정규식 표현 (개 중요~)


텍스트 데이터를 다루다 보면 텍스트에서 일정한 패턴을 찾아야 할 때가 있다.

패턴이란 이메일 주소 형식, ‘한글 문자 연속 세 개’, ‘열 자리 숫자’ 등 텍스트가 배열된 규칙을 뜻한다.

 

이처럼 텍스트의 패턴을 나타내는 텍스트를 정규식(regular expression)이라고 부른다.

 

어떤 텍스트에서 지정한 패턴이 발견될 때 ‘텍스트에 패턴매치한다’라고 한다.

패턴 매치를 활용하면 텍스트가 올바른 형식인지, 텍스트에 어떤 내용이 포함되어 있는지 등을 확인할 수 있다.

 

예를 들어, 사용자가 입력한 이메일 주소가 올바른 형식인지 검사하거나, 문서에서 한글이 몇 자이고 알파벳이 몇 자인지 셀 수도 있다. 정규식은 텍스트를 다루는 대부분의 프로그램에서 유용하게 활용된다.

 

 

 

정규식 re method


함수 값 or 기능
re.compile ( pattern )

패턴 문자열 -> 패턴 객체로 컴파일.

(정규식이 빠른 이유다. string을 패턴객체로 compile을 진행함으로써 빠르게 진행이 가능하다.)

re.search ( pattern, string ) string -> pattern과 들어있는 텍스트를 탐색
re.match ( pattern, string ) string -> pattern과 매치하는 텍스트를 탐색 (시작점 동일)
re.fullmatch ( pattern, string ) string -> pattern과 매치하는 텍스트를 탐색 (모두 동일)
re.sub ( pattern, repl, string ) string -> pattern과 매치하는 텍스트를 repl로 치환
re.split ( pattern, string ) string을 pattern 기준으로 나눔

 

정규식을 패턴 객체로 컴파일하기


>>> import re                             # 정규식 모듈 임포트
>>> pattern_string = r'파이썬'            # '파이썬' 패턴 문자열
>>> pattern = re.compile(pattern_string)  # 패턴 문자열을 패턴 객체로 컴파일

객체를 compile 하기 전에, 우리는 string 앞에 r을 붙여준다.

그 이유는, re에서 ' 이 부분이 escape 구문이 될 수도 있어서, 이를 구분해주기 위해 r'-----' 이라고 적어준다.

 

 

정규식 패턴으로 문자열 탐색하기


>>> re.search(pattern, '파이썬')         # 매치한다: Match 객체 반환
<_sre.SRE_Match object; span=(0, 3), match='파이썬'>

>>> re.search(pattern, '즐거운 파이썬')  # 일부 텍스트와 매치한다
<_sre.SRE_Match object; span=(4, 7), match='파이썬'>

>>> re.search(pattern, '파이프')         # 매치하지 않는다: None 반환

탐색은 search, match, fullmatch 3가지가 존재한다.

 

우선 탐색을 했을 경우, 조건에 맞다면 match 객체를, 아니면 None를 출력한다.

 

아래는 'Python' 이라는 패턴을 search, match, fullmatch 했을 때 과연 True를 출력하는지에 대한 표이다.

함수 Python Python Programming Hi, Python
re.search() : 문자열 존재 match match match
re.match() : 시작점도 같아야 match match None
re.fullmatch() : 모두 같아야 match None None

 

예시)

match = re.search('파이썬', '파이썬 프로그래밍')
if match:
    print('문자열에 패턴과 매치하는 텍스트가 존재함')
else:
    print('문자열에 패턴과 매치하는 텍스트가 존재하지 않음')
    
>>> match = re.search(pattern, '즐거운 파이썬 프로그래밍')
>>> match.group()
'파이썬'

group으로 패턴객체의 내용을 보여준다.

 

정규식 패턴으로 문자열 치환하기


>>> re.sub(pattern, '리스프', '즐거운 파이썬 프로그래밍')
'즐거운 리스프 프로그래밍'

>>> re.sub(' ', '*', '즐거운 파이썬 프로그래밍')
'즐거운*파이썬*프로그래밍'
re.sub ( pattern, repl, string ) -> 'string' 속 'pattern' -> 'repl' 로 치환한다.

sub는 맨 뒤 parameter, string에서 / pattern을 찾아내어 / repl로 치환하는 것을 의미한다.

 

 

정규식 패턴으로 문자열 나누기


>>> re.split(pattern, '즐거운 파이썬 프로그래밍')
['즐거운 ', ' 프로그래밍']

# find, replace, split, 모두 쌉가능

앞에서 살펴본 re 모듈의 함수들이 수행하는 패턴 탐색, 문자열 치환, 분자열 분리 작업은 일반 문자열 객체의 메서드(find(), replace(), split(). 4.3절 참고)로도 수행할 수 있다.

 

 

정규식의 특수 기호 (사실 이 부분이 제일 중요....)


 정규식의 특수 기호
정규식의 특수 기호

>>> sample = '이름: 김파이, 연락처: 010-1234-5678, 주소: 부산 어딘가'
>>> pattern = re.compile(r'01\d-\d{3,4}-\d{4}')
>>> match = re.search(pattern, sample)
>>> match.group()
'010-1234-5678'

위의 기호 두 가지 table을 잘 기억하고 있다가, 섞어서 써보면 좋을 듯 하다.

 

https://python.bakyeono.net/chapter-11-2.html

 

11.2 텍스트 처리 | 파이썬 프로그래밍 입문서 (가제)

박연오가 도서출판 인사이트와 함께 준비하고 있는 파이썬 프로그래밍 입문서입니다. 질문과 의견은 페이지 하단의 댓글란에 남겨주세요.

python.bakyeono.net

 

댓글