기록하는삶
[파이썬/python] 정규표현식(regex), re 모듈, 메타 문자 본문
특정한 패턴을 가지는 문자를 표현하는 공식을 정규식 혹은 정규표현식이라 하는데, re 모듈과 함께 정규식을 적절하게 사용하면 문자열 다루기나 데이터 크롤링 등의 작업에서 효율적인 작업을 할 수 있다.
0) 정규식 연습장
꿀팁이다. 해당 링크로 이동하면, 테스트하고 싶은 텍스트를 입력한 뒤에 손쉽고 보기 좋게 정규식 표현을 해당 텍스트에 적용해볼 수 있다.
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번 이하로 반복된 형태를 찾으며, 둘 중 하나는 생략될 수 있다.
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)
외에도 보다 심도 있는 내용은 위의 점프 투 파이썬을 참고하자.
'AI > 파이썬(Python)' 카테고리의 다른 글
[파이썬/Python] Numpy 모듈 (2) (0) | 2022.01.21 |
---|---|
[파이썬/Python] Numpy 모듈 (1) (0) | 2022.01.21 |
[파이썬/python] collections 모듈, deque, Counter, defaultdict (0) | 2022.01.19 |
[파이썬/python] 코딩 컨벤션(Coding Convention), flake8 모듈, black 모듈 (1) | 2022.01.19 |
[파이썬/python] 함수의 parameter 전달 방식, call by object reference (0) | 2022.01.18 |