업데이트:

2 분 소요

개요

내가 정규표현식을 처음 접한 것은 파이썬이 아니라 코퍼스 언어학이라는 강의를 들을 때 였다. ‘AntConc’라는 프로그램에서 정규표현식을 이용해 어떤 단어나 문자의 빈도수나 이외의 정보들을 검색할 수 있었는데, 그 뒤로 파이썬에서 볼 수 있어서 반가웠다.

정규표현식?

정규표현식은 검색패턴을 정의하는 문자의 연속으로 문자열 검색 알고리즘이나 검색 후 문자를 대체하는 알고리즘에 사용된다.

정규표현식은 위에서 언급한 것 처럼 패턴을 정의하는 것으로 아래의 표현식을 사용해서 패턴을 정의 해줄 수 있다.

문자 클래스에서의 정규표현식

  • [a-z]
    소문자 인 모든 철자

  • [A-Z]
    대문자 인 모든 철자

  • [0-9]
    모든 숫자
  • [aeiouy]
    모든 영문 모음
  • [Aa]
    A나 a를 의미한다.
  • [A-E0-3]
    모든 영어 대문자 A 에서 E0 에서 3 까지의 숫자

  • \w
    ‘-‘(hypen)를 포함한 모든 단어 철자

  • \s
    공백

비문자 클래스에서의 정규표현식

  • \W
    단어가 아닌 모든 문자

  • \S
    공백이 없는 모든 문자

  • [^A-Z]
    대문자가 아닌 영어 철자

양사

  • \*
    모든 발생 수

  • \?
    발생하지 않거나 1번 발생

  • \+
    1번 또는 그 이상 발생

  • {n}
    정확히 n번 발생

  • {n, }
    적어도 n번 또는 그 이상 발생

  • {n, m}
    n번에서 m번 발생

고정, 그룹핑(특정 부분 출력), 대체

  • \b
    단어 경계

  • ^
    그 줄의 처음

  • &
    그 줄의

  • (\sapples\s)
    apple을 뜻하는 그룹

  • (X|Y)
    X 또는 Y

이와 같은 정규식의 조합으로
\b\w+(?=([.!?]|$))
처럼 사용할 수 있다. 해당 패턴은 구문의 끝과 문장의 끝에 나오는 모든 단어 의 패턴을 나타낸 것이다.

Python regex

파이썬 에서는 re 라이브러리를 import 함으로써 정규표현식을 사용할 수 있다.

import re

re 라이브러리에서 사용할 수 있는 요소들을 출력해보았다.

dir(re)  
>> ['A',
    'ASCII',
    'DEBUG',
    'DOTALL',
    'I',
    'IGNORECASE',
    'L',
    'LOCALE',
    'M',
    'MULTILINE',
    'Match',
    'Pattern',
    'RegexFlag',
    'S',
    'Scanner',
    'T',
    'TEMPLATE',
    'U',
    'UNICODE',
    'VERBOSE',
    'X',
    '_MAXCACHE',
    '__all__',
    '__builtins__',
    '__cached__',
    '__doc__',
    '__file__',
    '__loader__',
    '__name__',
    '__package__',
    '__spec__',
    '__version__',
    '_cache',
    '_compile',
    '_compile_repl',
    '_expand',
    '_locale',
    '_pickle',
    '_special_chars_map',
    '_subx',
    'compile',
    'copyreg',
    'enum',
    'error',
    'escape',
    'findall',
    'finditer',
    'fullmatch',
    'functools',
    'match',
    'purge',
    'search',
    'split',
    'sre_compile',
    'sre_parse',
    'sub',
    'subn',
    'template']

사용할 수 있는 많은 메서드들이 있지만 그 중 자주 사용하게 되는 몇 가지를 추려보았다.


compile

정규표현식을 사용하기 위해서 문자열 형태의 regex를 패턴으로 해석할 수 있게 컴파일 해주어야 한다.

p = re.compile('[a-z]')

이렇게 변수에 저장해서 사용하지 않고 그때그때 사용할 수 있지만 반복적으로 사용하는 경우에 위와 같은 방식이 유용하다.

match

정의한 패턴으로 검색한 문자와 일치하는 문자를 출력한다.
처음이 일치하지 않는다면 None을 return한다.

p = re.match('barking', "A barking dog never bites'")

print(p)
>> <re.Match object; span=(2, 9), match='barking'>

search

정의한 패턴으로 검색한 문자와 일치하는 문자를 출력한다.
처음이 일치하지 않아도 전체를 검색한다.

p = re.search('barking',"A barking dog never bites")  

print(p)
>> None

sub

특정 문자열을 찾아서 다른 문자열을 바꿔줄 수 있다.

re.sub('패턴','바꿀 문자열', '대상 문자열', 바꿀 횟수)

예시는 다음과 같다

re.sub('apple|orange', 'fruit', 'apple box orange tree')#apple 또는 orange를 fruit로 바꾼다.
>> 'fruit box fruit tree'

이 메서드는 자연어 처리 전처리 과정에서 불용어를 제거하는데에 요긴하게 쓰인다.

sentence = "He is a ten-year-old boy."
sentence = re.sub("([^a-zA-Z.,?!])", " ", sentence)

>> He is a ten year old boy.

참고

https://hamait.tistory.com/342

https://whatisthenext.tistory.com/116

https://dojang.io/mod/page/view.php?id=2438

댓글남기기