[Python] 파이썬 코딩 도장 - 43.6 심사문제: URL 검사하기

미남잉·2021년 10월 28일
0

연습 문제: 보러 가기

43.6 심사문제: URL 검사하기

표준 입력으로 URL 문자열이 입력 입력됩니다. 입력된 URL이 올바르면 True, 잘못되었으면 False를 출력하는 프로그램을 만드세요. 이 심사문제에서 판단해야 할 URL의 규칙은 다음과 같습니다.

  • http:// 또는 https://로 시작
  • 도메인은 도메인.최상위도메인 형식이며 영문 대소문자, 숫자, -로 되어 있어야 함
  • 도메인 이하 경로는 /로 구분하고, 영문 대소문자, 숫자, -, _, ., ?, =을 사용함

judge_regular_expression.py

# 코드 작성
________________________________
________________________________
________________________________

작성한 답

import re

url = input('url 입력하삼==>')
p = re.compile(^[http://]+[a-zA-Z0-9-]+/[a-zA-Z0-9-_.?=]+$)

print(p.match(url) != None))

입력

http://www.example.com/hello/world.do?key=python

결과

True

입력

https://example/hello/world.html

결과

False

풀이

  • url = input('url 입력하삼==>')

문자열이 입력되어야 하므로 input() 입력 값을 받은 뒤 변수에 저장.(변수는 url 사용)

  • ^https?://

먼저 URL은 http:// 또는 https://로 시작한다고 했으므로 정규표현식은 ^https?://로 시작합니다. 여기서 맨 앞에 ^를 붙였으므로 http 또는 https로 시작하는지 판단합니다. 그리고 https?와 같이 만들면 s가 0개 또는 1개 있어야 합니다. 따라서 http와 https를 둘 다 판별할 수 있습니다.

  • [a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+/

도메인 판단 부분

-> [a-zA-Z0-9-]+ : 같이 영문 대소문자, 숫자, -이면서 문자 1개 이상인지 판단합니다.

-> \. : .를 넣어서 도메인.최상위도메인 형식인지 판단합니다. 여기서 .은 정규표현식에 사용하는 특수 문자이므로 앞에 반드시 \를 붙여야 합니다.

-> . : 특히 최상위 도메인은 여러 단계일 수도 있으므로 [a-zA-Z0-9-.]+/와 같이 범위에 .을 넣어줍니다.

-> /: 도메인과 도메인 이하 경로를 구분할 수 있도록 /를 붙여줍니다.

-> [a-zA-Z0-9-_/.?=]*: 도메인 이하 경로는 영문 대소문자, 숫자, -, , ., ?, =을 사용한다고 했으므로 [a-zA-Z0-9-/.?=]*와 같이 만들어줍니다. 특히 하위 경로가 더 나올 수 있으므로 범위 안에 /를 넣어야 합니다.

지금까지 만든 정규표현식을 차례대로 연결해서 re.match 함수로 url을 판단해주면 됩니다. 그리고 re.match 함수의 반환값이 있으면(None이 아니면) True를 출력하고, None이면 False를 출력하면 됩니다.

긴 풀이를 먼저 차근차근 읽고 정리해보았습니다.

다시 제 정답과 오답을 비교해보겠습니다.

# 오답임
import re

url = input('url 입력하삼==>')
p = re.compile(^[http://]+[a-zA-Z0-9-]+/[a-zA-Z0-9-_.?=]+$)

print(p.match(url) != None))

저는 re 라이브러리를 불러오고, url 이란 변수에 input 값을 받았습니다.

정규표현식을 compile한 후, match 메서드를 통해 url이 맞는지 확인하는 건데요.

이 문제는 결국 url 주소 형식을 이해하고, 정규 표현식을 활용하여 작성할 수 있는지 물어보는 꽤 난이도가 있는 문제라 생각합니다.🙄

정답

import re
p = re.compile('^(https?://)[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+/[a-zA-Z0-9-_/.?=]*')
print(p.match(input()) != None)

오답: ^[http://]+[a-zA-Z0-9-]+/[a-zA-Z0-9-_.?=]+$

정답: '^(https?://)[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+/[a-zA-Z0-9-_/.?=]*'

도메인 형식: http://(or https://) 도메인.최상도메인

url 주소를 해당 주소로 참고해 보고 이해해봅시다! 아래 형식도 도메인.최상도메인 형식입니다.

https://regexr.com/4dlbq

참고로 위 주소를 누르고 들어가면 더 엄밀하게 표현된 url 주소가 포함되어 있습니다.

profile
Tistory로 이사갔어요

0개의 댓글