匹配uuid.uuid4().hex生成的值的正确regex是什么?

2024-05-23 23:47:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

uuid.uuid4().hex

应该是正则表达式吗?此窗体的32个字符长字符串生成的值:

60e3bcbff6c1464b8aed5be0fce86052

Tags: 字符串uuid窗体代码生成hex个字符uuid4
3条回答

更具体地说。 这是使用破折号和不使用破折号捕捉uuid4的最精确的正则表达式,并且遵循uuid4的所有规则:

[a-f0-9]{8}-?[a-f0-9]{4}-?4[a-f0-9]{3}-?[89ab][a-f0-9]{3}-?[a-f0-9]{12}

你可以确保它也捕捉大写字母忽略大小写。在我使用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)

然后你可以:

if valid_uuid(my_uuid):
    #Do stuff with valid my_uuid

以^开头,以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

据我所知,马蒂金的回答并非百分之百正确。UUID-4有五组十六进制字符,第一组有8个字符,第二组有4个字符,第三组有4个字符,第四组有4个字符,第五组有12个字符。

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

00000000-0000-4000-0000-000000000000
              ^

第四组必须从8,9,a或b开始

00000000-0000-4000-a000-000000000000
              ^    ^

因此您必须将Martijn的regex更改为:

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

希望这有帮助!

很简单:

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

如果使用.match()方法(从字符串的开头搜索,请参见^{} vs. ^{}),则仅匹配完全32个十六进制字符的字符串。\Z匹配字符串的结尾(而$匹配字符串的结尾新行)。

相关问题 更多 >