【问题标题】:Match file path in url regex匹配 url 正则表达式中的文件路径
【发布时间】:2016-12-11 17:41:53
【问题描述】:

我需要匹配图片的路径:
images/05a813eb-df00-4ed6-b8a5-2930f03fbf5d.jpg
我按目录、名称和分机拆分它

def url(self, name):
    prefix, _ = name.split('/')
    file_name, ext = _.split('.')
    return reverse('image_storage',
                   args=[prefix, file_name, ext])

所以我有images05a813eb-df00-4ed6-b8a5-2930f03fbf5djpg 我的网址格式:

url(r'^img/(?P<prefix>\w+)/(?P<uuid4>[0-9a-f][0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.(?P<ext>\w+)  

但它不匹配,请帮我找到解决方案。

【问题讨论】:

  • URL 中有images,正则表达式中有img,为什么?您定义了(?P&lt;prefix&gt;\w+),但您提供的字符串只有1 个/[0-9a-f][0-9a-f]{8} 需要 9 个字符,但有 8 个。
  • @WiktorStribiżew /img 是存储的 url,images 是目录,以后可能会超过一个目录
  • 试试^(?P&lt;prefix&gt;\w+)/(?P&lt;uuid4&gt;[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.(?P&lt;ext&gt;\w+)或更短的^(?P&lt;prefix&gt;\w+)/(?P&lt;uuid4&gt;[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12})\.(?P&lt;ext&gt;\w+)。啊,我明白了,可以有一个可选的目录。
  • 将uuid部分简化为(?P&lt;uuid4&gt;[0-9a-f-]+)可能更容易

标签: regex django django-urls


【解决方案1】:

你可以使用

^images/(?:(?P<prefix>\w+)/)?(?P<uuid4>[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12})\.(?P<ext>\w+)

regex demo

images/ 之后的可选目录与可选组 (?:(?P&lt;prefix&gt;\w+)/)? 匹配。 ? 量词匹配 1 次或 0 次出现。 如果可能超过 1 个,请使用 * 而不是 ?(但我想您必须考虑正确的“前缀”组边界)。

另外,您的正则表达式中的[0-9a-f][0-9a-f]{8} 需要 9 个字符,但实际上有 8 个。

3 个连续的-[0-9a-f]{4} 可以直接收缩到另一个非捕获组(?:-[0-9a-f]{4}){3}

注意:最好在模式前面加上 (?i)(不区分大小写的修饰符):(?i)^images/(?:(?P&lt;prefix&gt;\w+)/)?(?P&lt;uuid4&gt;[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12})\.(?P&lt;ext&gt;\w+)

【讨论】:

    猜你喜欢
    • 2022-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2020-09-30
    • 2014-08-23
    • 2018-01-08
    • 1970-01-01
    相关资源
    最近更新 更多