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

时间:2012-07-08 16:06:33

标签: python regex

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

uuid.uuid4().hex

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

60e3bcbff6c1464b8aed5be0fce86052

4 个答案:

答案 0 :(得分:87)

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

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

00000000-0000-4000-0000-000000000000
              ^

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

00000000-0000-4000-a000-000000000000
              ^    ^

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

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

希望这有帮助!

答案 1 :(得分:35)

更具体一点。 这是使用和不使用破折号捕获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

答案 2 :(得分:15)

足够简单:

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

这仅适用于完全 32个十六进制字符的字符串,前提是您使用.match()方法(从字符串的开头搜索,请参阅.search() vs. .match())。 \Z匹配字符串的结尾(与$匹配,它将匹配字符串换行符的结尾)。

答案 3 :(得分:0)

只是作为性能问题的帮助说明,我已经在执行时间方面测试了这两种方式,并且正则表达式验证方法要快得多:

import re
from uuid import UUID


def _validate_uuid4(uuid_string):
    try:
        UUID(uuid_string, version=4)
    except ValueError:
        return False
    return True

def _validate_uuid4_re(uuid_string):
    uuid4hex = 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 = uuid4hex.match(uuid_string)
    return bool(match)

ipython命令中:

  

在[58]中:val = str(uuid.uuid4())

     

在[59]中:%time _validate_uuid4(val)   CPU时间:用户0 ns,sys:0 ns,总计:0 ns   壁挂时间:30.3 µs   Out [59]:是

     

在[60]中:%time _validate_uuid4_re(val)   CPU时间:用户0 ns,sys:0 ns,总计:0 ns   壁挂时间:25.3 µs   出[60]:是

     

在[61]中:val =“ invalid_uuid”

     

在[62]中:%time _validate_uuid4(val)   CPU时间:用户0 ns,sys:0 ns,总计:0 ns   壁挂时间:29.3 µs   出[62]:错

     

在[63]中:%time _validate_uuid4_re(val)   CPU时间:用户0 ns,sys:0 ns,总计:0 ns   壁挂时间:25.5 µs   出[63]:错