匹配uuid.uuid4().hex生成的值的正确正则表达式是什么?

LA_*_*LA_ 32 python regex

如何验证值是否等于此代码生成的UUID4?

uuid.uuid4().hex
Run Code Online (Sandbox Code Playgroud)

它应该是一些正则表达吗?由此形式的32个字符长的字符串生成的值:

60e3bcbff6c1464b8aed5be0fce86052
Run Code Online (Sandbox Code Playgroud)

小智 95

据我所知,Martijn的回答并非100%正确.UUID-4有五组十六进制字符,第一组有8个字符,第二组有4个字符,第三个是4个字符,第四个是4个字符,第五个是12个字符.

但是要使其成为有效的UUID4,第三组(中间的一组)必须以4开头:

00000000-0000-4000-0000-000000000000
              ^
Run Code Online (Sandbox Code Playgroud)

第四组必须以8,9,a或b开头.

00000000-0000-4000-a000-000000000000
              ^    ^
Run Code Online (Sandbox Code Playgroud)

所以你必须改变Martijn的正则表达式:

import re
uuid4hex = re.compile('[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}\Z', re.I)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 如果有人复制粘贴上面的Timmy正则表达式,则在第四个"af"范围内有两个零宽度unicode字符会导致一个不正确的配置"......不是一个有效的正则表达式:坏字符范围-f ..."异常.这又是固定的`[0-9a-f] {8}\ - [0-9a-f] {4}\ - 4 [0-9a-f] {3}\ - [89ab] [0-9a -f] {3}\ - [0-9A-F] {12}` (6认同)
  • 我需要这个正则表达式来匹配一个URL与Django的'uuid4`输出,包括破折号.这是一个URL段(它可能对将来的某个人有用):`(?P <uuid> [0-9a-f] {8}\ - [0-9a-f] {4}\ - 4 [ 0-9A-F] {3}\ - [89ab] [0-9A-F] {3}\ - [0-9A-F] {12})` (5认同)
  • 不,Martijn的答案是正确的。如果您会注意到,问题是在问uuid的十六进制表示形式,而不是uuid本身。 (3认同)

Chr*_*fer 43

更具体.这是使用和不使用破折号捕获uuid4的最精确的正则表达式,它遵循UUID4的所有规则:

[a-f0-9]{8}-?[a-f0-9]{4}-?4[a-f0-9]{3}-?[89ab][a-f0-9]{3}-?[a-f0-9]{12}
Run Code Online (Sandbox Code Playgroud)

您可以确保它也使用忽略大小写捕获大写字母.在我的例子中re.I. (uuid的输出中没有大写字母,但在输入中它不会失败,只是忽略它.意味着在UUID中"f"和"F"是相同的)

我创建了一个验证器来捕获它们看起来像这样:

def valid_uuid(uuid):
    regex = re.compile('^[a-f0-9]{8}-?[a-f0-9]{4}-?4[a-f0-9]{3}-?[89ab][a-f0-9]{3}-?[a-f0-9]{12}\Z', re.I)
    match = regex.match(uuid)
    return bool(match)
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

if valid_uuid(my_uuid):
    #Do stuff with valid my_uuid
Run Code Online (Sandbox Code Playgroud)

在开头的^和最后的\ Z我也确保字符串中没有其他内容.这确保"3fc3d0e9-1efb-4eef-ace6-d9d59b62fec5"返回true,但"3fc3d0e9-1efb-4eef-ace6-d9d59b62fec5 + 19187"返回false.

更新 - 下面的python方式并非万无一失 - 请参阅注释:

还有其他方法可以验证UUID.在python中:

from uuid import UUID
try:
    UUID(my_uuid)
    #my_uuid is valid and you can use it
except ValueError:
    #do what you need when my_uuid is not a uuid
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 17

很容易:

import re
uuid4hex = re.compile('[0-9a-f]{32}\Z', re.I)
Run Code Online (Sandbox Code Playgroud)

这仅适用于正好为 32个十六进制字符的字符串,前提是您使用该.match()方法(从字符串的开头搜索,请参阅.search()vs..match()).的\Z匹配字符串(对比的端部$,其将匹配在字符串的末尾换行).

  • 这个答案实际上是不正确的,因为它缺少保留位 - 请参阅@aguynamedguy的答案 (5认同)