用于捕获 URL 中所有文件夹(包括正斜杠)的正则表达式模式

发布于 2025-01-10 16:01:52 字数 818 浏览 0 评论 0原文

我想要匹配动态创建的网址,其中可以有多个文件夹。为此需要一些正则表达式模式。对于前。

http://127.0.0.1:8000/api/:user_id/:foldersa/:folders1/
http://127.0.0.1:8000/api/:user_id/:foldersb/:folders2/:folders3/:folders4
http://127.0.0.1:8000/api/:user_id/:foldersc/:folders2/
http://127.0.0.1:8000/api/:user_id/:foldersd/:folders1/:folders2/

所以直到 BASE_URL/api/:user_id/ 很常见。我可以捕获 user_id,但想捕获单个字符串变量上的 user_id 之后的其他参数。
之后,可以有任意数量的文件夹,我想将它们全部捕获到一个字符串变量中。
就像捕获的第一个 URL 字符串变量将是 "foldera/folder1/" 一样,对于下一个 url 字符串变量将是 "folderb/folder2/folder3/folder4" 以及 fwd 斜杠。

我应该在 urls.py 中编写什么正则表达式模式来捕获此文件夹?
我尝试过 re_path(r'(?P[-\w]+)/(?P(.*?)(?:\/)?$)/.*', customLink, name= 'customLink'),

但无法让它工作。

I want to match dynamically created URLs which can have multiple folders. Need some regex pattern for this. For ex.

http://127.0.0.1:8000/api/:user_id/:foldersa/:folders1/
http://127.0.0.1:8000/api/:user_id/:foldersb/:folders2/:folders3/:folders4
http://127.0.0.1:8000/api/:user_id/:foldersc/:folders2/
http://127.0.0.1:8000/api/:user_id/:foldersd/:folders1/:folders2/

so till BASE_URL/api/:user_id/ is common. I can catch user_id but want to catch other params after user_id on a single string variable.
after that, there can be any number of folders and I want to catch them all in one single string variable.
like for first URL string variable caught will be "foldera/folder1/" and for next url string variable will be "folderb/folder2/folder3/folder4" along with fwd slashes.

What regex pattern should I write in urls.py for capturing this folders?
I tried with
re_path(r'(?P<user_id>[-\w]+)/(?P<customUrl>(.*?)(?:\/)?$)/.*', customLink, name='customLink'),

but couldn't get it to work.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浊酒尽余欢 2025-01-17 16:01:52

您可以匹配除最后一个可选尾部斜线之外的所有内容:

re_path(r'(?P<user_id>[-\w]+)/(?P<custom_url>.*?)/?

在视图中,您可以使用以下方式拆分端点: 您

def customLink(request, user_id, custom_url):
    endpoints = custom_url.split('/')
    # …

还可以使用路径转换器:

# app_name/converters.py

class EndpointsConverter:
    regex = ".*?"
    
    def to_python(self, value):
        return value.split('/')
    
    def to_url(self, value):
        if isinstance(value, str):
            return value
        return '/'.join(value)

然后您可以使用路径转换器:

from django.urls import path, register_converter
from app_name.converters import EndpointsConverter

register_converter(EndpointsConverter, 'endpoints')

urlpatterns = [
    path('<str:user_id>/<endpoints:endpoints>/', customLink, name='customLink'),
    # …
]

这将自动拆分(并加入)端点端点由斜线表示。

, customLink, name='customLink'),

在视图中,您可以使用以下方式拆分端点: 您

还可以使用路径转换器:

然后您可以使用路径转换器:

这将自动拆分(并加入)端点端点由斜线表示。

You can match all but the last optional trailing slash:

re_path(r'(?P<user_id>[-\w]+)/(?P<custom_url>.*?)/?

in the view you can then split the endpoints with:

def customLink(request, user_id, custom_url):
    endpoints = custom_url.split('/')
    # …

You can also make use of a path converter:

# app_name/converters.py

class EndpointsConverter:
    regex = ".*?"
    
    def to_python(self, value):
        return value.split('/')
    
    def to_url(self, value):
        if isinstance(value, str):
            return value
        return '/'.join(value)

then you can work with a path converter:

from django.urls import path, register_converter
from app_name.converters import EndpointsConverter

register_converter(EndpointsConverter, 'endpoints')

urlpatterns = [
    path('<str:user_id>/<endpoints:endpoints>/', customLink, name='customLink'),
    # …
]

this will automatically split (and join) the endpoints by the slashes.

, customLink, name='customLink'),

in the view you can then split the endpoints with:

You can also make use of a path converter:

then you can work with a path converter:

this will automatically split (and join) the endpoints by the slashes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文