연습 문제: 보러 가기
표준 입력으로 URL 문자열이 입력 입력됩니다. 입력된 URL이 올바르면 True, 잘못되었으면 False를 출력하는 프로그램을 만드세요. 이 심사문제에서 판단해야 할 URL의 규칙은 다음과 같습니다.
# 코드 작성
________________________________
________________________________
________________________________
작성한 답
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
문자열이 입력되어야 하므로 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 주소를 해당 주소로 참고해 보고 이해해봅시다! 아래 형식도 도메인.최상도메인
형식입니다.
참고로 위 주소를 누르고 들어가면 더 엄밀하게 표현된 url 주소가 포함되어 있습니다.