본문 바로가기
프로그래밍/정규표현식

[정규 표현식] 응용 (1) URI(URL)에서 정보 가져오기 with Python

by 부자 꽁냥이 2022. 10. 11.

이번 포스팅에서는 지금까지 배운 정규 표현식 내용을 바탕으로 실전 문제에 응용하는 방법을 알아보자. 여기서는 파이썬(Python)을 이용하여 URL에서 변수와 값을 가져오는 방법을 알아보고자 한다.


   URI(URL)에서 정보 가져오기

먼저 다음과 같은 문자열이 있다고 해보자.

 

https://regex101.com/index.html?address=seoul&en=utf-8 HTTP/1.0

 

만약 아래와 같이 URL의 변수와 값 영역만을 가져오고 싶다면 어떻게 해야 할까?

정규 표현식을 만드는 방법에는 White List, Black List 방식이 있다고 한다. White List는 검사 범위에 포함되는 문자열 패턴을 만들어나가는 방식이고 Black List 방식은 검사 범위에 포함되지 않는 문자열 패턴을 피하는 일 종의 여집합(Complement)을 이용하는 방식이다. 각각의 방법을 이용하여 원하는 영역을 한 번에 뽑아주는 정규 표현식을 만들어보자.


1) White List

먼저 변수와 값 영역은 '?'으로 시작한다는 것을 알 수 있다. 따라서 후행 연산자를 이용한 '(?<=\?)' 패턴이 나와줘야 할 것이다. 이때 패턴 '?'을 찾기 위해 '\?'으로 예외처리를 해주었다. 다음으로 변수와 값은 등호 '='으로 구분되어 있으며 값에는 마이나스 기호 '-'가 포함되어 있다. 그리고 변수 값 영역은 '&'으로 구분되어 있다. 따라서 다음과 같은 패턴을 이용하여 찾을 수 있을 것이다.

 

(?<=\?)([-\w]+=[-\w]+&?)+

 

[-\w]+=[-\w]+ 는 등호를 기준으로 좌우에 알파벳과 '-'로 이루어진 변수와 값을 찾고 뒤에 &?은 있거나 없거나 둘 중 하나를 의미한다. 또한 이러한 패턴을 그룹으로 묶고 이를 반복적으로 찾게 하도록 마지막에 +를 붙여서 ([-\w]+=[-\w]+&?)+을 완성한다.

 

실제로 테스트를 해보자.

 

import re

string = 'https://regex101.com/index.html?address=seoul&en=utf-8 HTTP/1.0'

pattern = r'(?<=\?)([-\w]+=[-\w]+&?)+'

print(re.search(pattern, string).group())

 


2) Black List

이번엔 Black List 방식으로 정규 표현식을 만들어보자. 우선 변수와 값 영역에는 '?'가 들어가지 않는다. 따라서 '?'를 포함하지 않는 문자가 하나 이상인 패턴 [^\?]+을 고려해볼 수 있다. 그리고 마지막 등호를 찾을 수 있도록 뒤에 '='을 붙여서 패턴 [^\?]+=을 만들어주었다. 이 패턴의 검사 범위를 살펴보자. 여기에 들어가면 내 정규 표현식 패턴을 테스트할 수 있다. 

 

아래 그림을 보면 '?'과 마지막 등호 '=' 사이의 영역을 검사하고 있다. 하지만 마지막 값인 utf-8까지 포함시켜야 한다. 

 

따라서 다음과 같이 패턴에 .*을 추가하여 [^\?]+=.*을 만들 수 있을 것이다. 이를 테스트해보면 다음과 같이 필요 없는 HTTP/1.0이라는 문자열까지 포함하게 된다. 

 

이때 utf-8 옆에 공백이 있는데 공백을 제외하는 패턴인 [^\s]*을 이용하면 다음과 같이 제대로 변수와 값 영역을 잡아낼 수 있다.

 

 

이제 파이썬을 이용하여 테스트해보자.

 

import re

string = 'https://regex101.com/index.html?address=seoul&en=utf-8 HTTP/1.0'

pattern = r'[^\?]+=[^\s]*'

print(re.search(pattern, string).group())

 


참고자료

강명훈 - 데이터 분석이 쉬워지는 정규표현식


댓글


맨 위로