Python regex

정규식 컴파일하기

>>> import re

>>> p = re.compile('ab*')

정규식 컴파일하기

>>> import re

>>> p = re.compile('ab*', re.IGNORECASE)

백슬래시(\) 문제

>>> import re

>>> p = re.compile('\section')

백슬래시(\) 문제

>>> import re

>>> p = re.compile('\\section')

백슬래시(\) 문제

>>> import re

>>> p = re.compile('\\\\section')

백슬래시(\) 문제

>>> import re

>>> p = re.compile(r'\\section')

정규식 검색

컴파일 된 패턴 객체가 제공하는 메소드

match() 문자열의 처음부터 정규식과 매치되는지 조사한다.
search() 문자열 전체를 검색하여 정규식과 매치되는지 조사한다.
findall() 정규식과 매치되는 모든 문자열(substring)을 리스트로 리턴한다
finditer() 정규식과 매치되는 모든 문자열(substring)을 iterator 객체로 리턴한다

실습

match object

group() 매치된 문자열을 리턴한다.
start() 매치된 문자열의 시작 위치를 리턴한다.
end() 매치된 문자열의 끝 위치를 리턴한다.
span() 매치된 문자열의 (시작, 끝) 에 해당되는 튜플을 리턴한다.

실습2

모듈 단위로 수행하기

>>> m = re.match('[a-z]+', "python")

컴파일에서 사용하는 옵션들

  • DOTALL, S
    • 줄바꿈 문자를 포함하여 모든 문자와 매치할 수 있도록 한다.
  • IGNORECASE, I
    • 대소문자에 관계없이 매치할 수 있도록 한다.
  • MULTILINE, M
    • 여러줄과 매치할 수 있도록 한다. (^, $ 메타문자의 사용과 관계가 있는 옵션이다)
  • VERBOSE, X
    • verbose 모드를 사용할 수 있도록 한다. (정규식을 보기 편하게 만들수 있고 주석등을 사용할 수 있게된다.)

예제1

>>> p = re.compile('a.b', re.DOTALL)

>>> m = p.match('a\nb')

>>> print(m) <_sre.SRE_Match object at 0x01FCF3D8>

예제2

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

>>> p.match('python')

<_sre.SRE_Match object at 0x01FCFA30>

>>> p.match('Python')

<_sre.SRE_Match object at 0x01FCFA68>

>>> p.match('PYTHON')

<_sre.SRE_Match object at 0x01FCF9F8>

예제3

import re

p = re.compile("^python\s\w+", re.MULTILINE)

data = """python one

life is too short

python two

you need python

python three"""

print(p.findall(data))

['python one', 'python two', 'python three']

예제4

group

  • group(0) - 매치된 전체 문자열
  • group(1) - 첫번째 그룹에 해당되는 문자열
  • group(2) - 두번째 그룹에 해당되는 문자열

>>> p = re.compile(r"(\w+)\s+((\d+)[-]\d+[-]\d+)")

>>> m = p.search("park 010-1234-1234")

>>> print(m.group(3))

010

group

  • group(0) - 매치된 전체 문자열
  • group(1) - 첫번째 그룹에 해당되는 문자열
  • group(2) - 두번째 그룹에 해당되는 문자열

>>> p = re.compile(r"(\w+)\s+((\d+)[-]\d+[-]\d+)")

>>> m = p.search("park 010-1234-1234")

>>> print(m.group(3))

010

group

>>> p = re.compile(r"(?P<name>\w+)\s+((\d+)[-]\d+[-]\d+)")

>>> m = p.search("park 010-1234-1234")

>>> print(m.group("name"))

park

sub - 문자열 바꾸기

>>> p = re.compile('(blue|white|red)')

>>> p.sub('colour', 'blue socks and red shoes')

'colour socks and colour shoes'

Python regex

By Ming Kim

Python regex

  • 571