Home [NLP] 정규표현식 Regular Expression
Post
Cancel

[NLP] 정규표현식 Regular Expression

정규표현식의 문법과 파이썬에서 활용하는 법을 작성했습니다.

목차


정규표현식이란?

특정한 문자의 패턴을 정의하는 방식


메타문자

메타문자란 정규표현식을 위해 원래 의미가 아닌 다른 용도로 사용되는 문자

dot(.)

. : 다빈치코드에서 조커같은 느낌. 줄바꿈문자(\n) 제외하고 아무거나 와도 된다.

  • da.ce - dance, damce 등등 매칭. 단, dace는 매칭 X.

반복

* : 0번 이상 반복된 모든 문자와 매칭, 스페이스바도 하나의 문자임!

  • dan*ce - dace, dance, dannnce 매칭됨.
  • p = re.compile('ab*') - a로 시작하며 그 뒤에 b가 0개 이상 붙어있는 패턴.

+ : 1번 이상 반복된 모든 문자와 매칭.

  • dan+ce - dance, dannce 등

{m,n} : m 이상 n 이하로 반복된 모든 문자와 매칭

  • dan{1,3}ce - n이 1~3번 반복되어야 매칭.

{m} : 정확히 m번 반복

{m,} : m번 이상 반복

? : 0 or 1번 반복

  • dan?ce - dance, dace 매칭됨.

SWITH

STARTSWITH (^) - 문자열 시작 ENDSWITH ($) - 문자열 끝

1
2
3
p = re.compile('^[aA]nd [a-zA-Z]+', re.M)
# 문자열 시작이 대소문자 a로 시작하고 뒤에 nd, 그 뒤에 한 칸 띄고 영어 대소문자가 1개 이상 있는 문자열과 매칭, 각 라인에서 매칭
# And to, And the, 등


기초문법

대괄호[]

[abc] : a, b, c 중 하나와 매칭
[^abc] : a, b, c를 제외한 모든 문자 중 하나와 매칭 [dn]a : 앞이 d or n, 그 다음이 a인 것과 매칭
[a-eA-E] : 소문자 a부터 e까지, 대문자 A부터 E까지

패턴그룹화 - 소괄호()

소괄호로 여러 개 문자로 이뤄진 패턴 생성 가능
(abc) : abc 매칭

  • to(ma|pa){1,3}to
  • to로 시작, 중간에 ma 또는 pa가 1번 이상 3번 이하 반복되고, to로 끝나는 문자와 매칭, tomato, tomamato, tomapato 등등

역슬래시

문자열에서 이스케이프 시퀀스의 시작을 알려주는 역할

  • \n 줄바꿈, \t 현재시간 등

메타문자 앞에 \ 붙여줘야 원래 의미로 쓰임

  • 괄호 쓰고 싶으면 앞에 \ 붙여줘서 괄호를 문자로 인식하도록.
  • ex. (xxx)xxx-xxxx의 형식인 전화번호 추출하기 - \([0-9]{2,3}\)[0-9]{3}-[0-9]{4}

예제: 특허 링크 추출하기

  1. 모든 특허 링크 추출하기, http로 시작하고 .zip으로 끝나는 텍스트와 매칭되도록
    • http.*\.zip *가 반복 허용이니까 .(암거나)가 여러 번 와도 된다는 뜻
  2. 2000년대 특허 링크 추출하기, http로 시작하고 .zip으로 끝나면서 주소의 가운데 일부가 2000~2009와 매칭되도록
    • http.*200[0-9].*\.zip
  3. 2000년 이전 특허 링크 추출하기, http로 시작하고 .zip으로 끝나면서 주소의 가운데 일부가 1900년대와 매칭되도록
    • http:*\/19[0-9]*\/.*zip 년도 앞 슬래시까지 매칭


Python에서 정규표현식 활용

1
2
3
4
import re

# 패턴 생성하기
p = re.compile('ab+') # Pattern 클래스의 객체임.

Pattern 객체의 메서드

  • match() - 문자열 처음부터 매칭되는지 확인. 시작부분이 매칭되어야 함!
  • search() - 문자열 전체 탐색해 매칭되는지 확인
  • findall() - 매칭되는 모든 문자열 반환
  • finditer() - 매칭되는 모든 문자열 iterator(반복가능객체) 형태로 반환
  • sub() - 매칭되는 모든 문자열 다른 문자열로 수정
1
2
3
4
5
6
7
8
p = re.compile('^python \w+')

# ^ : 문자열이 주어진 패턴으로 시작할 때 매칭
# \w : 문자 + 숫자와 매칭. == [a-zA-Z0-9]
# + : 1개 이상 존재

# 즉, python으로 시작하며 한 칸 띄고 아무 문자나 1개 이상 존재하는 문자열과 매칭 
# 예를 들어 'python one'

패턴 생성 시 옵션 사용

  • re.DOTALL - 개행 문자 포함한 모든 문자와 매칭
  • re.l - 대소문자 구별 없이 매칭
  • re.M - 문자열 각 라인마다 매칭
    1
    
    p = re.compile('a.b', re.DOTALL) # a\nb도 매칭됨!
    

💡헷갈리는 개념 복습

대괄호 [abc] - abc 문자 중 하나 중괄호 ap{2,3}le - 반복 - apple, appple 소괄호 (abc) - abc 매칭

전방탐색

문자열 전방부터 탐색하는 방식

긍정형 전방탐색

  • (?=문자)
  • = 뒤의 문자와 일치하는 텍스트를 전방부터 탐색
  • 문자는 검색 조건으로 사용되나 결과에는 포함 XXX
    1
    2
    3
    4
    5
    
    # http://www.naver.com, ftp://000.000.000.000 등에서 colon(:) 앞 부분 추출하기
    p = re.compile('.+(?=:)')
    tmp_str = 'http://www.naver.com'
    result = p.search(tmp_str)
    print(result) # <re.Match object; span=(0, 4), match='http'>
    

부정형 전방탐색

  • (?!문자)
  • ! 뒤의 문자와 일치하지 않는 텍스트를 전방부터 탐색
  • 문자는 검색 조건으로 사용되나 결과에는 포함 XXX
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 확장자가 bar이거나 exe인 파일 제외하고 추출하기
tmp_str = """
foo.bar
autoexec.bat
sendmail.cf
autorun.exe
"""

p = re.compile('.*[.](?!bar|exe).*$', re,M)
results = p.finditer(tmp_str)
for result in results:
    print(result) 
# <re.Match object; span=(9, 21), match='autoexec.bat'>
# <re.Match object; span=(22, 33), match='sendmail.cf'>

후방탐색

문자열 후방부터 탐색

긍정형 후방탐색

  • (?<=문자)

부정형 후방탐색

  • (?<!문자)