기록하는삶

[파이썬/python] 정규표현식(regex), re 모듈, 메타 문자 본문

AI/파이썬(Python)

[파이썬/python] 정규표현식(regex), re 모듈, 메타 문자

mingchin 2022. 1. 20. 00:26
728x90
반응형

특정한 패턴을 가지는 문자를 표현하는 공식을 정규식 혹은 정규표현식이라 하는데, re 모듈과 함께 정규식을 적절하게 사용하면 문자열 다루기나 데이터 크롤링 등의 작업에서 효율적인 작업을 할 수 있다.

 

0) 정규식 연습장

https://regexr.com/

 

RegExr: Learn, Build, & Test RegEx

RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).

regexr.com

꿀팁이다. 해당 링크로 이동하면, 테스트하고 싶은 텍스트를 입력한 뒤에 손쉽고 보기 좋게 정규식 표현을 해당 텍스트에 적용해볼 수 있다.

 

1) 메타 문자

상당 부분 점프 투 파이썬의 내용을 참고하였다. 

 

정규식에서는 원래 의미와 다르게 사용되는 아래의 메타 문자들이 존재하며, 그 의미를 잘 알아둘 필요가 있다.

① 문자 클래스 []

찾고자 하는 문자가 명확할 경우, 그냥 해당 문자열을 찾아주면 된다. 다만  'a로 시작하는 단어', 'z를 포함하는 단어' 처럼 일종의 규칙을 가진 단어를 찾기 위해서는 문자 클래스인 []를 필요로 한다. []의 의미는, '[] 안에 있는 글자들과의 매치'로, [] 안에 포함된 글자 중 하나라도 포함하는 경우 모두 검색된다.

 

ex)

- [abcde] : a,b,c,d,e 중 하나라도 포함하는 모든 문자열 (대소문자의 구분이 있다.)

- [a-zA-Z] : 영어로 된 모든 문자열

- [가-힣] : 한글로 된 모든 문자열

- [0-9] : 숫자로 된 모든 문자열

 

과 같은 의미이며, ^를 사용할 경우 일종의 여집합으로 작용한다.

 

- [^a-zA-Z] : 영어가 아닌 모든 문자열

- [^가-힣] : 한글이 아닌 모든 문자열

- [^0-9] : 숫자가 아닌 모든 문자열

 

외에도 의미는 같지만 백슬래쉬(\)를 이용한 표현도 있는데, 아래와 같다.

출처: 점프 투 파이썬

② Dot(.)

 

모든 문자를 가리킨다. 아래 예시를 보면 이해할 수 있다.

문자 그대로 't.e'를 찾고 싶다면 't[.]e'를 사용해야 한다.

 

③ *와 +

문자의 반복을 나타낸다는 점에서 동일하지만, +는 앞에 위치한 문자가 1번 이상 반복될 때에만 잡아낸다는 것이 다르다.

다음의 차이에서 알 수 있는데, 위 *를 사용했을 때는 w(모든 영어)* 이므로 w로 끝나는 경우 w까지 잡아내는 반면, 아래는 w(모든 영어)+로 w 뒤에 하나의 문자라도 붙어있어야 찾아내므로 w로 시작하는 단어를 잡아낼 수 있다.

 

④ {m}과 {m,n}, ?

 

역시나 반복을 의미하는데, 특정 횟수나 범위의 반복을 지정할 수 있다. 대표적인 것이 전화번호가 되겠다.

S{m}의 형태로 사용하면 S가 m번 반복된 형태를 찾는다.

S{n,m}의 형태로 사용하면 S가 n번 이상 m번 이하로 반복된 형태를 찾으며, 둘 중 하나는 생략될 수 있다.

가운데 숫자가 4개 이상인 숫자를 찾은 예시

n은 생략되면 0을, m은 생략되면 2억이 넘는 숫자를 의미해서 예시에서도 {0,4}의 0은 생략해도 파이썬에서 잘 작동한다. 

?는 {0,1}을 의미하는 것으로, 앞의 문자가 없거나 하나만 있는 경우를 의미한다. (있을 수도 있고 없을 수도 있다는 것.)

 

⑤ ^와 $

 

^를 문자클래스 [] 안에서 사용하면 여집합의 의미였다. ^를 그냥 문자열과 결합해 사용하면, 해당 문자열로 시작하는 문자열만을 의미한다.

 반대로 $를 맨 뒤에 붙이면, 해당 문자열로 끝나는 문자열만을 의미한다.

⑥ 그루핑 ()

 

특정 정규식의 묶음을 만들 수 있다. (바로 위 사진도 예시에 해당)

(\w: 문자+숫자, \s: white space, \d: 숫자)

group 메서드로 특정 그룹만 읽어올 수 있는데, index의 의미는 아래와 같다.

2) re 모듈의 메서드(compile, findall)

가장 기본이 되는 findall만 정리해본다.

 

먼저 공통적으로 re.compile('정규표현식')으로 찾고자 하는 규칙의 문자열을 compile 한 뒤에 사용하는 것이 좋다. 예를 들면,

위 코드와 아래 코드는 동일한 작동을 하지만, 먼저 규칙을 compile 하고 method를 사용하는 것이 시간 복잡도 면에서 훨씬 우월하다고 한다. (특히나 같은 규칙에 대해 잦은 반복을 할 때)

 

예시에서 알 수 있듯, findall 함수는 전체 문자열에 대해 규칙에 해당하는 모든 문자열을 리스트에 담아 반환한다.

 

replace와 비슷한 기능을 하는 sub를 활용해 괄호를 포함한 모든 문자열을 제거하는 등의 작업도 가능하다. (https://mingchin.tistory.com/64)

 

외에도 보다 심도 있는 내용은 위의 점프 투 파이썬을 참고하자.

 

 

728x90
반응형