【Django】 urls.py의 urlpatterns의 r '^ $ '와 r''은 무엇이 다른가?

4433 단어 장고정규식
결론부터 말하면 「어째서 너 그런 질문을 하는 거야?」라고 정도 다릅니다만, 처음 보았을 때 거동을 이미지할 수 없었던 것과, 특수 문자 때문에 구구는 전혀 히트하지 않았던 것도 있어 기사로 둡니다.

것의 발단



최근 Django의 개발 안건에 어사인 되었기 때문에 소스 코드 보면서 공부하고 있었습니다만, Rails로 말하는 곳의 라우터인 urls.py (루트 URLconf)에 이런 식으로 라우팅이 정의되고 있었습니다.

urls.py
(...)

urlpatterns = [
    url(r'^$', views.hoge),
    url(r'', include(fuga)),
    (...)
]

(...)

첫 번째 줄은 알 수 있습니다. 경로 지정없이 루트 디렉토리에 액세스했을 때의 루트입니다 ~라고.

2행째는 무엇입니까・・・. 공문자···? 루트 디렉토리의 뒤에 공문자이기 때문에, 1행째와 같으면···? ? ?

열심히 Google에서 「urlpatterns 공문자」라든지 조사해 보았습니다만, 그러한 해설에는 만날 수 없고・・・.

해결편



곤란해지고 사용 Slack에서 「모르겠어~!」라고 환하고 있으면, 상냥한 선배 방법이 도와 주었습니다.

빈 문자와 일치하는 r'' 라는 정규 표현식은 분명히 모든 문자열과 일치하는 와일드카드 작성 방법과 같습니다.

그렇게 말해 「과연」이라고 생각해, 스스로도 검증해 보면,

sample.py
import re
if(re.match(r'', "abcde")):
    print("match") # -> "match"
if(re.match(r'', "         ")):
    print("match") # -> "match"

사실, 무엇이든 일치합니다.

즉, 위의 urlpatterns 의 쓰는 방법은, 「루트 디렉토리 이외에의 액세스는 어쨌든 전부 include(fuga) 해 줘」라고 하는 의미였군요. 더 이상 공부가되었습니다.

좀 더 자세히



우선 당초의 의문은 해소한 것입니다만, 아무래도 모야모야 합니다. 그것도 검증하는 과정에서

sample.py
import re
m = re.findall(r'', "abcde")
print(m) # -> ['', '', '', '', '', '']

···어떤 일? 라는 의문이 생겼기 때문입니다.

다시 생각하고 있는 사이에, 「정규 표현은 오토마톤」이라고 하는 것을 기억했습니다. 오토마톤에 대해서는 아직 사람에게 제대로 설명할 수 있을 정도로 공부할 수 없었습니다만, 싹둑 말하면 「입력에 의해 상태가 천이하는 기구(정말 그것 같다)」라고 생각하고 있습니다.

즉, r'' 라고 하는 정규 표현은, 「「아무것도 입력이 없다 1



(엉성한 그림으로 죄송합니다)

그러므로 문자열 abcder'' 그렇습니다.

선배가 「 m 는 끝까지 읽어야 하지만 r'.*' 라고 하는 이야기라고 생각합니다만, 맛있는 공부하려고 합니다).

요약



정규 표현의 구글러빌리티의 낮음에는 곤란한 것이군요・・・.

참고문헌



오토마톤 언어 이론 계산론 I [제2판] 』 사이언스사 2003년



오토마톤에서는 이것을 r'' 로 나타내는 것 같습니다.

좋은 웹페이지 즐겨찾기