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
'대학원 공부 > programming language' 카테고리의 다른 글
Python : basic : Override vs Overload (0) | 2019.12.01 |
---|---|
Python : basic : lambda function(람다함수) (0) | 2019.11.23 |
Python : basic : 문자열 (format) (0) | 2019.11.22 |
Python : basic : list.sort(), sorted (0) | 2019.11.22 |
Python : SQLite : SQLite 란? (0) | 2019.11.19 |
댓글