본문 바로가기

코딩/Python

[Python/파이썬] 문자열 처리 정규 표현식(regular expression) - 1

반응형

1편 : 2022.08.11 - [코딩/Python] - [Python/파이썬] 문자열 처리 정규 표현식(regular expression) - 1

2편 : 2022.09.03 - [코딩/Python] - [Python/파이썬] 문자열 처리 정규 표현식(regular expression) - 2 : 실제 예시를 통한 이해

 

 

  최근 회사 업무로 C 코드를 파이썬으로 파싱하는 작업을 하고 있는데 복잡한 문자열에 대해 처리가 필요하여 정리하는 글.  정규표현식이란 복잡한 문자열을 처리하기 위해 사용되는 식으로 파이썬뿐만아니라 문자열 처리가 가능한 Perl 등의 다른 프로그래밍 언어에서도 사용할 수 있다. 

 

  파이썬에서는 re(regular expression)라는 정규 표현식을 지원하는 내장 모듈이 있다. 앞으로의 정규표현식 공부 내용은 해당 모듈을 사용하여 정리 예정이다. 아래 내용은 위키독스의 점프투파이썬 책을 참고하였다.

 

 

 

1. re 모듈 기본 사용법

 

<코드>

import re

#컴파일 된 패턴 객체 생성(찾을 문자 규칙)
p = re.compile("abc")

#"abc"가 패턴객체 p에 match되는지 확인 
m = p.match("abc")

#결과 출력
print(m)

 

<결과>

<re.Match object; span=(0, 3), match='abc'>

 

- p는 패턴(pattern) 객체를 의미한다. 간단히 말해서 찾을 문자 규칙을 의미한다. 

- m은 매치(match) 객체를 의미한다. p.match("abc")는 "abc"문자가 p 패턴에 일치하느냐를 의미한다.

- 따라서, m을 출력하면 re.Match object가 반환된다. 

- 만약, match가 안될지 아래와 같이 None 이 출력된다.

- 참고로 match 함수는 문자열 처음부터 정규식 규칙과 부합되는지 확인하는 함수임.

  (비슷한 함수로 search가 있는데 2번에서 설명)

 

 

<코드>

#컴파일 된 패턴 객체 생성(찾을 문자 규칙)
p = re.compile("abc")

#"cba"가 패턴객체 p에 match되는지 확인 
m = p.match("cba")

<결과>

None

 

 

2. 문자열 규칙 기초(메타문자)

 

  문자열 규칙을 설명하기 전에 먼저 search와 match의 차이점에 대해 정리

 

1) search vs match

 

  - match : 첫글자 기준으로 일치하는지 확인. 아래 코드에서 숫자2는 첫글자에 없으므로 None 출력 됨.

 

<코드>

#컴파일 된 패턴 객체 생성(찾을 문자 규칙)
p = re.compile("2")

m = p.match("abcd-2-abcd")

 

<결과>

None

 

  - search : 문자열 전체에서 일치하는지(포함여부) 확인. 아래 문자열에 2가 포함되므로 위치를 반환한다.

 

<코드>

#컴파일 된 패턴 객체 생성(찾을 문자 규칙)
p = re.compile("2")

m = p.search("abcd-2-abcd")

 

<결과>

<re.Match object; span=(5, 6), match='2'>

 

 

2) [ ] 문자 클래스

 

 

- 아래 문자 조합에 따라 정규표현식에서는 다양한 문자 규칙을 만들어낼 수 있다.

 

. ^ $ * + ? { } [ ] \ | ( )

 

- [a-z] : 소문자만

  [a-zA-Z] : 영어 모두(알파벳 소문자, 대문자)

  [0-9] : 숫자만

 

- 앞에 ^를 붙일 경우 not 의 의미가 된다. [^a-z], [^a-zA-Z] ....

 

ex1) 임의의 문자열에서 소문자를 포함하는지 검출

 

<코드>

#컴파일 된 패턴 객체 생성(찾을 문자 규칙)
p = re.compile("[a-z]")

m = p.search("124-123a")

 

<결과>

<re.Match object; span=(7, 8), match='a'>

 

ex2) 숫자를 포함하지 않는 문자만 리스트로 반환

-. findall 함수는 정규식에 매치되는 각 문자를 리스트로 반환한다

 

<코드>

#컴파일 된 패턴 객체 생성(찾을 문자 규칙)
p = re.compile("[^0-9]")

m = p.findall("as132df-g12gg")

 

<결과>

['a', 's', 'd', 'f', '-', 'g', 'g', 'g']

 

[ ] 문자 클래스에서 자주 사용하는 규칙은 아래와 같이 특정 표기법으로 대체할 수 있다.

 

표기법 설명
\d [0-9]와 동일 표현
\D [^0-9]와 동일 표현
\s 공백 문자와 매치
\S 공백 문자가 아닌 경우 매치
\w 문자+숫자와 매치
\W 특수문자만 매치(문자+숫자가 아닌)

 

위 내용 중 \w(문자,숫자만)를 예시로 코드를 작성해보자.

 

<코드>

#컴파일 된 패턴 객체 생성(찾을 문자 규칙)
p = re.compile("\w")

m = p.findall("ybworld.tistory.com// 블로그명 : 투손플레이스")

 

<결과>

['y', 'b', 'w', 'o', 'r', 'l', 'd', 't', 'i', 's', 't', 'o', 'r', 'y', 'c', 'o', 'm', '블', '로', '그', '명', '투', '손', '플', '레', '이', '스']

 

- 위에서 \w은 [a-zA-Z0-9가-힣]과 동일하다. 가-힣은 문자열에 한글이 포함되는지 확인한다. 

728x90