python - 정규표현식

Web-Programming School 1월 22일 수업
본 문서는 패스트캠퍼스 ‘Web-Programming School’ 수업 자료를 바탕으로 작성되었습니다.

개인적으로 너무 힘들어 했던 부분 ㅜㅜ

특정한 패턴에 일치하는 복잡한 문자열 을 처리할 때 사용하는 기법 파이썬에서는 표준 모듈 re를 사용해서 정규표현식을 사용할 수 있음 import re 를 꼭 넣어줘야 한다!


정규표현식의 패턴 문자

패턴 문자 다른표현
\d 숫자 [0-9]
\D 비숫자 [^0-9]
\w 문자 [a-zA-Z0-9]
\W 비문자 [^a-zA-Z0-9]
\s 공백문자 [\t\n\r\f\v]
\S 비공백 문자 [^\t\n\r\f\v]
\b 단어 경계 -
\B 비단어경계 -

정규표현식의 패턴 지정자

패턴 의미
abc 리터럴 abc
(expr) expr
expr1ㅣexpr2 expr1 또는 expr2
. \n을 제외한 모든 문자
^ 소스문자열의 시작
$ 소스문자열의 끝
expr? 0 또는 1회의 expr
expr* 0회 이상의 최대 expr
expr*? 0회 이상의 최소 expr
expr+ 1회 이상의 최대 expr
expr+? 1회 이상의 최소 expr
expr{m} m회의 expr
expr{m,n} m에서 n회의 최대 expr
expr{m,n}? m에서 n회의 최소 expr
[abc] a or b or c
[^abc] not (a or b or c)
expr1(?=expr2) 뒤에 expr2가 오면 expr1에 해당하는 부분
expr1(?!expr2) 뒤에 expr2가 오지 않으면 expr1에 해당하는 부분
(?<=expr1)expr2 앞에 expr1이 오면 expr2에 해당하는 부분
(?<!expr1)expr2 앞에 expr1이 오지 않으면 expr2에 해당하는 부분

match 객체의 메서드

match : 시작부터 일치하는 패턴 찾기

문자열의 처음부터 정규식과 일치하는지 확인 (만약 처음부터 같지 않다면, 정규식을 찾지 못 함)

import re
lux = 'Lux, the Lady of Luminosity'
result = re.match('Lux', lux)

search : 첫 번째 일치하는 패턴 찾기

문자열 전체에서 일치하는 부분을 찾을 때 사용

m = re.search('Lady', lux)
if m:
    print(m.group())

findall : 일치하는 모든 패턴 찾기

정규식과 일치하는 모든 문자열을 리스트로 리턴

finditer : 일치하는 모든 패턴 찾기

정규식과 일치하는 모든 문자열을 반복 가능한 (iterator)객체로 리턴 반복 가능한 객체가 포함하는 각가의 요소는 match객체

split : 패턴으로 나누기

문자열의 split() 메서드와 비슷하지만 패턴을 사용할 수 있다.

sub : 패턴 대체하기

문자열의 replace()메서드와 비슷하지만 패턴을 사용할 수 있다.

매칭 결과 그룹화

정규표현식 패턴 중 괄호()로 둘러싸인 부분이 있을 경우, 결과는 괄호만 그룹으로 저장 Match 객체의 group()함수는 매치된 전체 문자열 을 리턴 groups()함수는 지정된 그룹 리스트 를 리턴 (?Pexpr) 패턴을 사용하면 매칭된 표현식 그룹에 이름을 붙여 사용할 수 있다.

#group() = group(0)
s = re.search(r'\w+\w(was)', story)
s.groups()
s.group(0)
s.group(1)

#매칭된 표현식 그룹에 이름을 붙여 사용 가능
m = re.search(r'(?P<before>\w+)\s+(?P<was>was)\s+(?P<after>\w+)', story)
m.groups()
m.group('before')
m.group('was')
m.group('after')

compile()

패턴을 컴파일하여 정규식 객체를 반환

p = re.compile(r'\w.*')

raw string = r’’

이스케이프 문자열을 표현하기 위해 (백슬래쉬) 를 사용하는데, 문자 ‘'를 정규표현식으로
표현하기 위해선 ‘\\‘로 표현해야한다. 이를 좀 더 편리하게 하기 위해 raw string 표기법 사용
문자열 앞에 r 을 더한 것으로, ‘'를 이스케이프 문자열로 처리하지 않고 일반 문자로 동일 처리

컴파일 옵션

  • DOTALL(S) - .이 줄바꿈 문자를 포함하여, 모든 문자와 매치,
    여러줄로 이루어진 문자열에서 \n에 상관없이 검색
  • IGNORECASE(I) - 대소문자에 관계없이 매치
  • MULTILINE(M) - 여러 줄 매치

실습 {m}패턴지정자를 사용해서 a로 시작하는 4글자 단어를 전부 찾는다.

m = re.compile(r'\ba\w{3}\b')
print(m.findall(story))

실습 r로 끝나는 모든 단어를 찾는다.

m = re.compile(r'\w+r\b')
print(m.findall(story))

실습 a,b,c,d,e중 아무 문자나 3번 연속으로 들어간 단어를 찾는다. ex) b[eca]me

 m = re.compile(r'\w*[abcde]{3}\w*')
 print(m.findall(story))

실습 re.sub를 사용해서 ,로 구분된 앞/뒤 단어에 대해 앞단어는 대문자화 시키고, 뒷단어는 대괄호로 감싼다. 이 과정에서, 각각의 앞/뒤에 before, after그룹 이름을 사용한다.

a = re.compile(r(?P<before>'w+')\s*,\s*(?P<after>\w+))
def sub_function(match_object):
    return f'{match_object.group("before").upper()},[{match_object.group("after")}]'

s2 = re.sub(a,sub_function,story)
print(s2)

더 많은 실습 자료들이 필요하면
정규표현식 예제 사이트