re 모듈은 문자열에서 특정 패턴을 만족하는 문자열을 찾고 싶을 때 유용한 기능을 제공하는 모듈이다. 특히 re 모듈에서 제공하는 match, search, findall 함수는 패턴과 매칭되는 문자열을 찾는 대표적인 방법이다.
이번 포스팅에서는 re 모듈에서 문자열 패턴을 찾는 방법을 알아보고자 한다.
re 모듈 - 패턴 찾기
1) 문자열 시작 부분만 살펴볼게~ : match
match는 주어진 패턴이 문자열 시작 부분과 매칭되면 re.Match 객체를 반환하고 매칭이 안되면 None, 즉 아무것도 반환하지 않는다. 아래 코드는 알파벳 소문자 한 개로 이루어진 문자를 찾는 과정이다. 이때 두 번째 문자열 'Hi how are you?'는 문자열 시작 부분이 대문자이므로 패턴 매칭이 안된다.
re.Match 객체는 group을 통하여 매칭되는 단어 또는 문자열을 출력하고 start는 매칭된 문자열 시작 위치를 나타낸다.
import re
pattern = re.compile('[a-z]') ## 찾을 패턴 = 소문자 알파벳 한개
string_list = ['hi how are you?', 'Hi how are you?']
for string in string_list:
## 해당 패턴이 문자열 시작부분에서 매칭되면 re.Match object 리턴, 매칭 안되면 None
match_string = re.match(pattern, string)
if match_string is not None:
print(match_string)
print('매칭 문자열 :', match_string.group()) ## 매칭되는 문자열 출력
print('매칭 인덱스 :', match_string.start()) ## 가장 처음 매칭되는 문자열 출력
else:
print('No Matched')
2) 문자열 어디든 살펴볼게~ 대신 한번만 찾아줌! : search
match는 문자열 시작 부분에서 패턴 매칭을 시도하지만 search는 문자열 어디든 패턴 매칭을 실시한다. 다만 매칭되는 모든 단어(또는 문자열)를 찾는 것이 아니라 한 번 매칭되면 종료된다. search도 match와 마찬가지로 매칭되는 패턴을 찾으면 re.Match 객체를 반환하고 아닌 경우 아무것도 반환하지 않는다.
앞의 경우와 다르게 search 함수는 두 번째 문자열 'Hi how are you?'에서 'H'는 매칭이 안되지만 바로 뒤에 'i'와 매칭되므로 re.Match 객체를 반환한다.
for string in string_list:
## 해당 패턴이 문자열 어디든 하나라도 매칭되면 re.Match object 리턴, 매칭 안되면 None
match_string = re.search(pattern, string)
if match_string is not None:
print(match_string)
print('매칭 문자열 :', match_string.group()) ## 매칭되는 문자열 출력
print('매칭 인덱스 :', match_string.start()) ## 가장 처음 매칭되는 문자열 출력
else:
print('No Matched')
3) 매칭되는 모든 것을 너에게 줄게!! : findall
findall은 매칭되는 모든 단어 또는 문자열을 리스트에 담아서 반환한다. 이게 좋은 것 같지만 문자열이 길 경우 시간이 많이 걸린다는 단점이 있다.
pattern = re.compile('[a-z]') ## 찾을 패턴 소문자 알파벳 한개
string_list = ['hi how are you?', '???##%']
for string in string_list:
## 해당 패턴이 문자열 매칭되는 모든 문자열을 리스트에 담는다
match_string_list = re.findall(pattern, string)
if len(match_string_list) > 0: ##
print('매칭 문자열 리스트 :', match_string) ## 매칭되는 문자열 출력
else:
print('No Matched')
'프로그래밍 > 정규표현식' 카테고리의 다른 글
[정규 표현식] re 모듈 알아보기 (3) finditer 사용법과 findall과의 차이 (0) | 2022.10.01 |
---|---|
[정규 표현식] 역 참조(Back reference) 알아보기 (0) | 2022.10.01 |
[정규 표현식] re 모듈 알아보기 (2) 대체하기 (feat. re.sub) (0) | 2022.09.30 |
[정규 표현식] 메타 문자 알아보기 (6) | 2022.09.26 |
[정규 표현식] 알파벳 패턴 대소문자 상관없이 매칭하기 (feat. (?i), re.IGNORECASE) (0) | 2022.09.18 |
댓글