[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🛠 기타/Data & AI

파이썬 정규표현식 - 기초활용

inu 2020. 7. 14. 22:24
반응형

정규표현식

import re
  • 자연어처리과정 중 데이터 전처리 과정에서는 데이터에서 유의미한 것을 찾아 처리해야 한다.
  • 이럴 때 주로 활용되는 것이 정규표현식이다.
  • 문자열의 패턴을 특정형태로 표현하여 텍스트에서 해당 문자열을 검색하거나 치환할 때 활용할 수 있다.
  • 파이썬에서는 re 모듈을 import하여 사용한다.

정규식 객체

re.compile(".")
  • re.compile(검색할문자열) 함수를 호출하면 정규식 객체 (re.RegexObject 클래스 객체)를 리턴하게 된다.
  • re.RegexObject 클래스는 여러 메소드를 보유하여 문자열 검색 혹은 치환을 도와준다.
  • 즉, 특정문자를 담고있는 정규식 객체를 활용하여 문자열을 검사 및 수정하는 것이다.
  • match() : 문자열의 처음부터 정규식과 매치되는지 조사한다. (매치 시 RegexObject리턴)
  • search() : 문자열 전체를 검색하여 정규식과 매치되는지 조사한다. (매치 시 RegexObject리턴)
  • findall() : 정규식과 매치되는 모든 문자열을 리스트로 돌려준다.
  • finditer() : 정규식과 매치되는 모든 문자열을 반복 가능한 객체로 돌려준다.

기본 메타문자

  • complie안에 평범한 문자열을 넣어 사용한다면 기존의 문자열 탐색 알고리즘과 비교해서 큰 차이가 없을 것이다.
  • 따라서 메타 문자를 활용하여 문자를 다양하게 표현하고 이에 따라 검색 문자열 패턴도 다양화할 수 있다.
[문자들]  문자들 중 하나여야함
[^문자들]  이 문자들이 아니어야함
모든 문자
+ 앞 패턴이 하나 이상이어야 함
앞 패턴이 0개 이상이어야 함
{m,n}  횟수 지정 m~n. 둘 중 하나만 입력해서도 사용가능. 쉼표 유지할 경우 이상 혹은 이하의 의미가 됨.
앞,뒤 두 패턴 중 하나여야함
시작
? 다음에 오는 문자의 매칭여부는 최초만 체크함

예제1

Q. ['abbbbba', 'cddb', 'aerb', 'aeeeb', 'almnj'] (모두 문자열)일 때 1, 3번째만 리턴하는 정규표현식을 작성하시오

import re

list_a = ['abbbbba', 'cddb', 'aerb', 'aeeeb', 'almnj']
p = re.compile('a..b')

for i in list_a:
    print(p.match(i))
==결과==
<re.Match object; span=(0, 4), match='abbb'>
None
<re.Match object; span=(0, 4), match='aerb'>
None
None

문자 클래스

  • 특정 종류의 문자를 이스케이프 문자와 유사하게 표현할 수 있다.
  • \d : 숫자
  • \D : not 숫자
  • \s : 공백
  • \S : not 공백
  • \w : 문자+숫자
  • \W : not 문자+숫자
  • 단, 이스케이프 문자와 겹칠 경우 문제가 발생할 수 있으므로 해당 문자 클래스를 사용할 경우 문자열 앞에 r을 표기한다. (ex : r'.+\s')

정규식 오브젝트 처리

  • 앞선 예제에서 보았듯, match와 같은 정규식 객체의 메소드를 통해 처리된 결과는 object형태이다.
  • 이를 활용하기 위해선 다른 함수를 더 처리해야 한다.
  • group() : 매치된 문자열 전부 / 일부(그룹안에 그룹명 혹은 번호 삽입시)
  • start() : 매치된 문자열 시작 인덱스
  • end() : 매치된 문자열 끝 인덱스
  • span() : 매치된 문자열 (시작,끝) 튜플
list_b = ['abcd efghopqr-stuv', 'abcd-efgh', 'abc defghijk', 'ab cdhijk']
p = re.compile(r'.+\s')

for i in list_b:
    matched = p.match(i)
    if matched is not None:
        print(matched.group())
==결과==
abcd 
abc 
ab 
반응형