본문 바로가기

프로그래밍언어/Python

[Python] 정규 표현식 (Regular Expressions)

반응형

■ 정규표현식: 복잡한 문자열을 특수한 기호들을 사용하여 처리하는 기법

 

 

■ 정규표현식 메타문자

  ※ 메타문자란 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자를 말한다.

 

  - 정규표현식에서 사용하는 메타문자들:  . ^ $ * + ? { } [ ] \ | ( )

 

  - []

    • 문자클래스

    • [ ] 사이의 문자들과 매치

    • ex) [abc]: "a, b, c 중 한 개의 문자와 매치"

 

    • '-'  하이픈 사용: 두 문자 사이의 범위를 표현

    • [a-d] == [abcd], [0-5] == [012345]

    • [a-zA-Z]: 알파벳 전체

    • [0-9]: 숫자

 

    • ^ 사용: not의 의미를 가지고 있다.

    • ex) [^0-9]: 숫자가 아닌 문자

 

  - . (dot)

    • '\n'을 제외한 모든 문자 한 개와 매칭된다.

    • ex) a.b: a + 모든문자 + b

 

  - *

    • 반복을 의미하는 문자이다.

    • * 앞에 있는 문자 한 개가 0부터 무한대로 반복될 수 있음을 표현하는 메타문자이다.

 

- +

    •*와는 달리 최소 1번 이상의 반복을 표현할 때 사용한다.

 

- {m, n}

    • {}를 사용하여 반복 횟수를 정할 수 있다.

    • 반복횟수 m부터 n까지 설정

    • {m}: m번 반복으로 고정

    • {m, n}: m ~ n회 반복

 

- ?

    • {0, 1}

    • ? 앞의 문자가 없거나 한 개 존재하는 경우

 

  - |

    • or의 의미로 사용된다.

    • A|B의 경우 A또는 B를 표현한 것이댜.

 

  - ^

    • 문자열의 맨 처음과 일치함을 의미한다.

    • ^AB: 문자열의 처음이 AB로 시작한다.

    • re.M과 함께 사용하는 경우 문자열 전체의 처음이 아닌 각 줄의 처음마다에 적용할 수 있다.

 

  - $

    • 문자열의 끝과 매치함을 의미한다.

    • re.M과 함께 사용하는 경우 문자열 전체가 아닌 각 줄의 끝과 비교하게 된다.

 

■ 정규표현식 문자 클래스

  - \d: 숫자와 매치, [0-9]와 동일한 표현식이다.

  - \D: 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식이다.

  - \s: whitespace 문자와 매치, [ \t\n\r\f\v]와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.

  - \S: whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일한 표현식이다.

  - \w: 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일한 표현식이다.

  - \W: 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_]와 동일한 표현식이다.

  - \A: 문자열의 처음과 매치. ^과는 달리 re.M 옵션에도 각 라인이 아닌 문자열 전체와 비교하게 된다.

  - \Z: 문자열의 끝과 매치. $과는 달리 re.M 옵션에도 각 라인이 아닌 문자열 전체의 끝과 비교하게 된다.

  - \b: 문자열을 구분하는 공백을 의미한다.  ex) '\babc\b'

  - \B: \b의 반대. 공백으로 구분되어있지 않는 경우.

 

■ re 모듈

  - 파이썬에서 정규 표현식을 지원해주는 모듈이다.

  - compile() 메서드를 사용하여 패턴 객체를 컴파일하여 반환해준다.

import re

p = re.compile('ab*')

 

■ 정규식을 이용한 문자열 검색

  - 컴파일 된 패턴 객체를 사용하여 문자열 검색을 할 수 있다.

import re

# 알파벳 반복을 표현한 패턴 객체를 생성
p = re.compile('[a-z]+')

 

  - match(): 문자열의 처음부터 패턴과 일치하는지 조사하는 메서드

m = p.match("python")
print(m)  # <_sre.SRE_Match object at 0x01F3F9F8>

m = p.match("3 python")
print(m)  # None

# 패턴과 일치하는 경우 match 객체를 일치하지 않는 경우에는 None을 반환한다.

  

  - search(): 문자열 전체를 검색하여 정규식과 매치되는지 조사한다.

m = p.search("3 python")
print(m)	# <_sre.SRE_Match object at 0x01F3FA30>

# match()와 달리 처음부터 일치하는지가 아닌 전체 문자열 중에 일치하는 부분이 있는 경우 match() 객체를 반환한다.

 

  - findall(): 정규식과 매치되는 모든 문자열(substring)을 리스트로 돌려준다.

result = p.findall("life is too short")
print(result)	# ['life', 'is', 'too', 'short']

 

  - finditer(): 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 돌려준다.

    • findall()과 달리 리스트가 아닌 iterator로 반환

    • 각각의 객체는 match 객체이다.

result = p.finditer("life is too short")
print(result)	# <callable_iterator object at 0x01F5E390>

for r in result:
	print(r)
'''
<_sre.SRE_Match object at 0x01F3F9F8>
<_sre.SRE_Match object at 0x01F3FAD8>
<_sre.SRE_Match object at 0x01F3FAA0>
<_sre.SRE_Match object at 0x01F3F9F8>
'''

 

■ match 객체

  - group(): 매치된 문자열을 돌려준다.

  - start(): 매치된 문자열의 시작 위치를 돌려준다.

  - end(): 매치된 문자열의 끝 위치를 돌려준다.

  - span(): 매치된 문자열의 (시작, 끝) 위치를 돌려준다.

m = p.match("python")
m.group()	# 'python'
m.start()	# 0
m.end()		# 6
m.span()	# (0, 6)

 

■ 컴파일 옵션

  - DOTALL(re.S): . 이 줄바꿈 문자(\n)를 포함하여 모든 문자와 매치할 수 있도록 한다.

  - IGNORECASE(re.I): 대소문자에 관계없이 매치할 수 있도록 한다.

  - MULTILINE(re.M): 여러줄과 매치할 수 있도록 한다. (^, $ 메타문자의 사용과 관계가 있는 옵션이다)
  - VERBOSE(X): verbose 모드를 사용할 수 있도록 한다. (정규식을 보기 편하게 만들수 있고 주석등을 사용할 수 있게된다.)

charref = re.compile(r'&[#](0[0-7]+|[0-9]+|x[0-9a-fA-F]+);')

charref = re.compile(r"""
 &[#]                # Start of a numeric entity reference
 (
     0[0-7]+         # Octal form
   | [0-9]+          # Decimal form
   | x[0-9a-fA-F]+   # Hexadecimal form
 )
 ;                   # Trailing semicolon
""", re.VERBOSE)

# VERBOSE 옵션을 사용하여 공백 및 주석을 정규표현식 내부에 사용할 수 있다.

 

■ 백슬래시

  - 문자 클래스의 '\'와 실제 문자 '\'의 혼용으로 오류발생

  - 백슬래시를 문자 클래스가 아닌 실제 문자로 사용하기 위해서는 \\와 같이 백슬래시 앞에 백슬래시를 하나 더 추가해준다.

  - raw string: 컴파일하는 정규표현식이 문자 클래스가 사용된 것이 아닌 raw string임을 알려주는 방법이다.

# 컴파일하는 문자열 앞에 r을 붙여서 raw string임을 알려준다.
p = re.compile(r'\\section')

 

■ 그루핑

  - 낱개 문자가 아닌 문자열의 반복 및 패턴의 정규표현식을 만들기 위해서 그루핑을 사용한다.

  - ( )를 사용하여 그루핑한다.

p = re.compile('(ABC)+')
m = p.search('ABCABCABC OK?')

print(m)	# <re.Match object; span=(0, 9), match='ABCABCABC'>
print(m.group())	# ABCABCABC

 

  - group 인덱스 사용

    • group(0)매치된 전체 문자열

    • group(1)첫 번째 그룹에 해당되는 문자열

    • group(2)두 번째 그룹에 해당되는 문자열

    • group(n)n 번째 그룹에 해당되는 문자열

반응형