기타

[정규 표현식] 전방 탐색

비번변경 2022. 8. 30. 16:31

전방 탐색

일치한 영역을 발견해도 그 값을 반환하지 않는 패턴을 의미한다.

하위 표현식으로, ?=라는 구문으로 시작해 등호 다음에 일치할 문자열이 온다.

 

💡 문자열 소비
정규 표헌식 관련 문서에서 일치하는 영역을 반환하는 동작을 '소비한다'라고 표현한다.
전방 탐색의 경우에는 문자열을 소비하지 않는다.

전방 탐색에는 긍정형과 부정형이 있다. 예시를 통해 알아보도록 하겠다.

 

긍정형 전방 탐색 (예시)

아래와 같은 웹 주소에서 http, https, ftp와 같은 값만 추출하려고 한다.

http://www.forta.com
https://mail.forta.com
ftp://ftp.forta.com

추출하고자 하는 문자열이 ':' 이전이므로 기본적으로 아래와 같은 패턴으로 찾을 수 있다.

.+:		# 하나 이상의 임의 문자:

 

코드

url_list = ['http://www.forta.com', 'https://mail.forta.com', 'ftp://ftp.forta.com']
for url in url_list:
    print(re.search('.+:', url).group())

.+: 패턴 확인

다만 추출한 문자열에 ':'가 포함되어 있다. 추가적으로 문자열을 잘라낼 수도 있지만, 전방 탐색을 이용하면 추가 작업 없이 원하는 값만 추출할 수 있다.

 

전방 탐색 패턴

일치할 패턴에는 포함시키지만, 반환 값에서는 제외할 문자 ':'를 전방 탐색 구문에 포함시킨다.

.+(?=:)

 

코드

url_list = ['http://www.forta.com', 'https://mail.forta.com', 'ftp://ftp.forta.com']
for url in url_list:
    print(re.search('.+(?=:)', url).group())

전방 탐색 확인

의도했던 대로 http, https 등만 추출한 것을 확인할 수 있다.

 

 

부정형 전방 탐색

패턴과 일치하는 문자열을 찾는 긍정형과는 다르게 부정형 전방 탐색은 패턴과 일치하지 않는 문자열을 찾는다.

?!라는 구문으로 시작해 ! 다음에 제외할 문자열이 온다.

 

다음과 같은 파일명과 확장자 목록이 있다고 하자. 목록에서 .bat인 파일은 제외하고 싶다.

foo.bar
autoexec.bat
sendmail.cf
text.txt
regex.py

 

파일명.확장자 패턴

.*[.].*$	# 임의 문자열.임의 문자열

기본 패턴이 주어졌을 때, .bat인 경우를 제외하기 위해서는 아래와 같은 복잡한 패턴이 필요하다.

.*[.]([^b].?.?|.[^a]?.?|..?[^t]?)$

이런 경우 부정형 전방 탐색을 사용하면 간단히 표현할 수 있다.

.*[.](?!bat).*

 

코드

file_list = ['foo.bar', 'autoexec.bat', 'sendmail.cf', 'text.txt', 'regex.py']
for f in file_list:
    print(re.search('.*[.](?!bat).*', f))

부정형 전방 탐색

 

 

exe 파일 또한 제외할 때는 | 문자를 이용하면 된다.

.*[.](?!bat|exe).*

 

 

참고 문서

https://wikidocs.net/4309#_11

 

07-3 강력한 정규 표현식의 세계로

이제 07-2에서 배우지 않은 몇몇 메타 문자의 의미를 살펴보고 그룹(Group)을 만드는 법, 전방 탐색 등 더욱 강력한 정규 표현식에 대해서 살펴보자. [TOC] # ...

wikidocs.net