본문 바로가기
C.W.K.
Stream
Lesson 02 of 12 · published

URL 매칭

~10 min · url, extraction

Level 0패턴 호기심
0 XP0/90 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

URL 검증과 URL 추출은 서로 다른 문제야

  1. 입력 전체가 URL 모양인지 확인하려면 문자열 양끝을 고정해야 하고
  2. 긴 글에서 URL처럼 보이는 부분을 찾으려면 주변 문장과 만나는 경계를 정해야 해.

전체 문자열의 모양을 확인하는 패턴

^https?://[\w-]+(\.[\w-]+)+(/[\w./?%&=+#-]*)?$

이 예시는 HTTP나 HTTPS 스킴, 점이 하나 이상 있는 도메인, 선택적인 경로를 요구해. 어디까지나 제한된 모양 검사라 실제로 해석 가능한 모든 URL을 포괄하지는 않아.

본문에서 URL 후보를 찾는 패턴

https?://[^\s)]+

스킴 뒤에서 공백이나 닫는 괄호 전까지를 잡아. 그래서 (https://example.com)처럼 괄호 안에 든 주소에서 마지막 괄호를 제외할 수 있어.

문장부호를 정리할 때 URL의 문법까지 지우지 마

문장 끝의 점, 쉼표, 느낌표가 후보에 붙을 수 있어. 매칭 뒤에 제거한다면 .,;:!처럼 문장 끝으로 쓰인 기호만 보수적으로 걷어 내. string.punctuation 전체를 지우면 유효한 마지막 /?까지 사라질 수 있어.

최종 판정과 해석은 URL 라이브러리에 맡겨

IP 리터럴, 포트, 국제화 도메인, 조각 식별자, 인코딩까지 정규식 하나로 검증하려 들면 패턴이 금방 무너져. Python은 urllib.parse.urlparse, JavaScript는 new URL(...), Go는 net/url처럼 대상 언어의 파서를 사용해.

Code

URL 패턴·python
import re

# 검증 (문자열 전체)
URL_VALID = re.compile(r'^https?://[\w-]+(\.[\w-]+)+(/[\w./?%&=+#-]*)?$')

bool(URL_VALID.fullmatch('https://example.com'))                # True
bool(URL_VALID.fullmatch('http://sub.domain.com/path?q=1'))     # True
bool(URL_VALID.fullmatch('not a url'))                          # False
bool(URL_VALID.fullmatch('ftp://example.com'))                  # False (http(s)만)

# 추출 (텍스트에서 찾기)
URL_FIND = re.compile(r'https?://[^\s)]+')
re.findall(URL_FIND, 'see https://pippa.dev or https://cwk.io for more (https://other.org)')
# ['https://pippa.dev', 'https://cwk.io', 'https://other.org']

# 문장 끝 구두점만 후처리로 제거해. '/', '?', '#'까지 지우면 URL이 망가져.
TRAILING_SENTENCE_PUNCTUATION = '.,;:!'
def clean_url(url):
    return url.rstrip(TRAILING_SENTENCE_PUNCTUATION)

# 실제 검증에는 URL 라이브러리 사용
from urllib.parse import urlparse
parsed = urlparse('https://sub.example.com:8080/path?q=1')
print(parsed.scheme)   # 'https'
print(parsed.netloc)   # 'sub.example.com:8080'
print(parsed.path)     # '/path'

External links

Exercise

코드에서 URL을 감지하거나 추출하는 부분을 찾아 현재 정규식이 검증용인지 추출용인지 구분해. 최종 URL 판정이 전용 파서를 통과하는지 확인하고, 단순 모양 검사만으로 끝난다면 어떤 오류를 놓칠 수 있는지 적어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.