본문 바로가기
ROKEY

[20250123] 파이썬 프로그래밍 - 정규표현식

by kode-daks 2025. 1. 23.

수업 목표

- 메타 문자의 의미와 사용법으르 이해할 수 있다.

- re 모듈의 compile 매서드를 통해 패턴 객체를 생성할 수 있다.

- 패턴 객체를 통해 문자열 검색 메서드를 사용할 수 있다.

- 컴파일 옵션 4가지 종류를 설명할 수 있다.

 

 

1. 정규표현식 기초, 메타 문자

메타 문자

- 원래 해당 문자가 가진 뜻이 아닌 특별한 의미를 가진 문자

- 정규 표현식에 다음 메타 문자를 사용하면 특별한 의미를 지님 : . ^ $ * + ? { } [ ] \ | ( )

 

[ ] 문자

- [ 와 ] 사이의 문자들과 매치

e.g. [abc]는 a, b, c 중 한 개의 문자와 매치를 의미함

 

- [ 와 ] 사이에 -를 사용하면 범위를 의미함

e.g. [a-c]는 [abc]와 동일

e.g. [A-Za-z] : 모든 알파벳

e.g. [0-9] : 모든 숫

 

- ^ 는 not을 의미함

e.g. [^0-9] : 숫자가 아닌 문자만 매

 

- 자주 사용하는 문자 클래스는 별도의 표기법이 존재

- \d == [0-9]

- \D == [^0-9]

- \s == [\t\n\r\f\v]

- 표현식 맨 앞 빈칸 == 공백 문자

- \S == [^\t\n\r\f\v]

- \w == [A-Za-z0-9_]

- \W == [^A-Za-z0-9_]

 

. 문자

- \n을 제외한 모든 문자

e.g. a.b ==  a + 모든문자 + b

 

* 문자

- * 바로 앞 문자가 0부터 무한대까지 반복될 수 있음을 의미

e.g. ca*t == ct, cat, caaat

 

+ 문자

- + 문자 바로 앞문자가 1부터 무한대까지 반복될 수 있음을 의미

e.g. ca+t == cat, caaat

 

{} 문자

- 반복 횟수의 범위를 제한하고 싶을 때 사용

e.g. ca{3,5}t == caaat, caaaaat

e.g. ca{1,}t  == ca+t

e.g. ca{0,}t == ca*t

e.g. ca{3}t == caaat

 

? 문자

- {0, 1} 과 같은 의미로 앞에 있는 문자가 있어도 없어도 괜찮음

e.g. ca?t == ct, cat

 

2. re 모듈

- 정규표현식을 지원하는 파이썬 ㅈ표준 라이브러리

- import re; p = re.compile('ab*')

- re.compile로 정규표현식 컴파일한 후 할당하여 작업 수행

 

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

문자열 검색

- match()

    - 문자열의 처음부터 정규식과 매치되는지 확인

    - 일치하는 부분에 대해 span(index)과 매치한 부분을 담은 match 객체를 리턴

    - 매치하지 않으면 None 리턴

 

- search()

    - 문자열 전체를 검색하여 정규식과 매치되는지 확인

    - search의 리턴 결과도 match 객체

 

- findall() : 정규식과 매치되는 모든 문자열을 리스트로 리턴

- finditer() : 정규식과 매치되는 모든 문자열을 반복 가능한 객체(match 객체로 구성)로 리턴

 

4. match 객체의 메서드

- 매치된 문자열 및 인덱스 확인 가능

- match 객체 메서드 종류 및 기능

    - group : 매치된 문자열을 리턴함

    - start : 매치된 문자열의 시작 위치를 리턴함

    - end : 매치된 문자열의 끝 위치를 리턴함

    - span : 매치된 문자열의 (시작, 끝)의 튜플을 리턴함

 

5. 컴파일 옵션

옵션

- DOTALL(S) : .이 줄바꿈 문자를 포함해 모든 문자와 매치

- IGNORECASE(I) : 대소문자에 관계 없이 매치

- MULTILINE(M)

    - ^ &를 사용할 때 여러 줄마다 확인

       c.f. ^python은 python으로 시작, python$ python으로 끝남

- VERBOSE(X)

    - verbose 모드

    - 코드처럼 분할해서 주석처리까지 가능함.

    - 이때의 개행과 화이트스페이스는 컴파일 시 제거됨

 

입력 방식

- re.compile('패턴', 옵션)의 방식으로 입력

    e.g. re.compile("[A-Z]+", re.DOTALL)

    e.g. re.compile("[A-Z]+", re.M)

 

6. 역슬래시 문제

- 실제 문자가 정규표현식에서 사용한 문자로 사용되는 혼란 요소

- \를 하나 더 추가해 원래 의도한 실제 문자로 사용

    e.g. \section -> \\section으로 표기해야 실제 원하는 \section으로 사용가능

    e.g. \\ -> \\\\

- r을 사용해도 똑같은 방식으로 사용해도 문자 그대로 사용 가능

    e.g. r"\\section" == \\section