Regex 匹配url正则表达式中的文件路径

Regex 匹配url正则表达式中的文件路径,regex,django,django-urls,Regex,Django,Django Urls,我需要匹配图像的路径: images/05a813eb-df00-4ed6-b8a5-2930f03fbf5d.jpg 我按dir、name和ext将其拆分 def url(self, name): prefix, _ = name.split('/') file_name, ext = _.split('.') return reverse('image_storage', args=[prefix, file_name, ext]

我需要匹配图像的路径:
images/05a813eb-df00-4ed6-b8a5-2930f03fbf5d.jpg

我按dir、name和ext将其拆分

def url(self, name):
    prefix, _ = name.split('/')
    file_name, ext = _.split('.')
    return reverse('image_storage',
                   args=[prefix, file_name, ext])
所以我有
图像
05a813eb-df00-4ed6-b8a5-2930f03fbf5d
jpg
我的url模式:

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(r'^img/(?P\w+)/(?P[0-9a-f][0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})。(?P\w+)
但不匹配,请帮我找到解决方案。

您可以使用

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

images/
之后的可选dir与可选组
(?:(?p\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\w+)?(?p[0-9a-f]{8}(?:-[0-9a-f]{4}{3}-[0-9a-f]{12})。(?p\w+)
URL中有
图像,regex中有
img
,为什么有
已定义,但您提供的字符串只有1个
/
[0-9a-f][0-9a-f]{8}
需要9个字符,但有8个。@WiktorStribiżew
/img
它是存储的url,
图像
它是目录,以后可能会尝试多个目录
^(?P\w+)(?P[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{-[0-9a-f]{12}\(?P\w+
或更短。啊,我明白了,可以有一个可选的dir。将uuid部分简化为
(?P[0-9a-f-]+)