[django] 장고에서 사용하는 정규표현식 ,path converter의미 (‘^route/(?P)$')

업데이트:

안녕하세요!👋
장고를 사용할때 대부분 그냥 배워서 get형식의 http method변수를 url에서 가져올 필요가 있을 경우 그냥 path에 이런거 넣으면 되더라
잘 알지 못하고 사용하다 보니 궁굼해져서 이번에 제대로 알아보았습니다
알아본 내용을 정리해 봅니다

🙏요약

이번 글에서는 정규 표현식과 이를 장고의 url라우터에서 사용되는 형태 그리고 path에서 사용되는 형태가 정규표현식과 무슨 관련이 있는지 알아보겠습니다

  1. 정규표현식
  2. 장고의 urls
  3. 장고의 path converter

📔정규표현식

image
정규표현식이란 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어라고 위키피디아에서 정의하고 있습니다

이러한 정규 표현식은 python 외에 많은 언어에서 활용하여 문자열중 특정한 규칙을 찾아내는데 사용되고 있습니다
이번에 url을 파싱하면서 이와같은 문법들이 django에서 활용되어 사용되고 있어 공부를 하고 정리해 보았습니다
잘 배우고 있는지 학습하기 위해 정규표현식 예제 사이트 를 활용하여 직접 작성해보고 검사해보며 학습하였습니다
그럼 제가 정리한 정규표현식 문자들에 대해 정리해보겠습니다

r’’          RAW스트링 -안에있는 정규표현식의 \를 실제 \로 인식(장고의 url에서는 r을 붙히고 작성해야함 안에 \를 이용한 캐릭터를 사용하여 그대로 가져가서 정규표현화 하기 위함으로 보임)
^           문자열의 시작과 매치
$           문자열의 마지막과 매치
^$ ^$사이에있는 글자가 정확히 들어맞아야 함
.            아무 글자나 한글자(띄어쓰기 포함 \n은 제외)
[]           대괄호 안에 있는 문자들 중 한글자
[a-z]      a부터 z까지 임의의 한글자
|            또는 (A|B : A 또는 B)

✨매우매우 중요✨
()           패턴의 부분을 저장 - \1,\2 등으로 순서대로 불러와서 사용

r'(abc)*'
매치o
- **abcabcabc**
- is the **abcabcabc**

사용
()의 단위를 1부터 저장하여 \1,\2 등으로 사용 가능

(?:) 패턴을 찾지만 저장은 안함
(?P) name이름으로 패턴을 저장 - (?P=name)으로 불러와서 사용
(?=) =뒤의 정규식을 패턴에 포함해서 찾지만 찾은 결과에는 반영하지 않음
(?!) !뒤의 정규식을 포함하는 패턴은 찾지 않음

예시 - r'http(?=:)'  -> http:가 포함된 것만 찾음 표시는 http만 표시

수량관련
* 최소 0번 이상 반복 ({0, } 과 동일)
+           최소 1번 이상 반복 ({1, } 과 동일)
?           0번 또는 1번 ({0, 1} 과 동일)
{n}         n번 반복
{m, n}    최소 m번에서 최대 n번 반복 (n 생략시 m번이상 반복)

역슬레쉬 관련
\         문자의 의미에서 탈출(앞에서 쓰인 괄호 등의 키워드 들을 \뒤에 적으면 그대로 나옴)
\b      문자 경계 \w와 \W사이
\B       \b의 반대 \w와 \w사이 또는 \W와 \W사이
\d        숫자 하나 ([0-9]와 동일)
\D       \d의 반대문자 하나(숫자가 아님)
\w      영문, 숫자, _ 중 하나[a-zA-Z0-9_]
\W      \w의 반대문자중 하나
\s        공백, 탭중 하나
\S        \s와 반대문자중 하나

이렇게 정리할 수 있는데요 꼭 한번씩 연습해보면서 모두 외우진 못해도 나중에 필요한 일이 생길 때 금방 보고 알아볼 수 있도록 익숙해 지시는게 좋을 것 같습니다

👀django에서 url route지정하는 법

image

위 사진은 django에서 urlpatterns를 통해 route를 지정하는코드인데요 첫번째 파라미터에 다양한 글자들이 보이는 걸 볼 수 있습니다
현재는 장고 2버전이 업데이트 되면서 url함수를 통한 path를 지정해주는 것이 거의 없고, 정규표현식을 이용한 path를 지정하기 위해선 re_path를 사용하는게 일반적입니다
위의 예시에서 re_path를 보시면 r'^swagger(?P<format>\.json|\.yaml)$' 라는 문자열이 보이실 겁니다.
path에서 django가 지정한 converter문법을 보기전 이러한 정규표현식으로 표현된 url을 알 수 있다면 path converter문법을 보더라도 금방 쉽게 이해하고 더 유용하게 사용할 수 있을 것입니다

앞의 정규표현식을 보고 오셨다면 어렵지 않게 느낌이 오실 건데요 r’‘안쪽의 문자열을 \포함해 그대로 정규표현식으로 사용하겠다는 것이구요 ^$ 내의 문자열과 완전히 일치하는 문자열만을 검사하겠다

앞에는 swagger로 시작하고 (?P<format>)를 통해 뒤에.json또는 .yaml이란이름을 가진 문자열을 format이라는 변수를 통해 나중에 사용하겠다는 의미입니다
따라서 /swagger.json ,/swagger.yaml이라는 urlpath는 뒤에나오는 함수로 보내라! 라는 뜻이 되겠죠

✨django에서 path converter란?

자 이제 위의 url route까지 이해했다면 django가 지정한 path converter라는 것이 있는데요

image

위와 같은 포멧의 변수를 (?P<>)를 사용하지 않고 편하게 사용할 수 있게 해주는 django의 path함수를 통해 route를 사용할 수 있는 문법입니다

위의 django코드 예시에서 보면 <id:int>라는 url뒤의글자를 볼 수 있죠?
이 이야기는 id라는 변수명으로 int형의 글자만 받아서 사용하겠다 라는 의미이고요 내부적으로 정규표현식을 통해 (?P<id>[0-9]+)로 표현할 수 있겠습니다
이는 당연히 view의 get과 연동하여 view의 해당 url에서의 get함수에서 id로 변수를 사용할 수 있게되겠죠!

지금까지 정규표현식과 django에서 사용되는 path에 대해 알아보았습니다

긴글 봐주셔서 감사합니다 안녕 👋

댓글남기기