정규표현식
업데이트:
개요
내가 정규표현식을 처음 접한 것은 파이썬이 아니라 코퍼스 언어학이라는 강의를 들을 때 였다. ‘AntConc’라는 프로그램에서 정규표현식을 이용해 어떤 단어나 문자의 빈도수나 이외의 정보들을 검색할 수 있었는데, 그 뒤로 파이썬에서 볼 수 있어서 반가웠다.
정규표현식?
정규표현식은 검색패턴을 정의하는 문자의 연속으로 문자열 검색 알고리즘이나 검색 후 문자를 대체하는 알고리즘에 사용된다.
정규표현식은 위에서 언급한 것 처럼 패턴을 정의하는 것으로 아래의 표현식을 사용해서 패턴을 정의 해줄 수 있다.
문자 클래스에서의 정규표현식
-
[a-z]
소문자 인 모든 철자 -
[A-Z]
대문자 인 모든 철자 [0-9]
모든 숫자[aeiouy]
모든 영문 모음[Aa]
A나 a를 의미한다.-
[A-E0-3]
모든 영어 대문자 A 에서 E 와 0 에서 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
댓글남기기