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

rvpgvaaj  于 2022-12-27  发布在  其他
关注(0)|答案(4)|浏览(206)

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

uuid.uuid4().hex

它应该是某种正则表达式吗?32个字符长的字符串生成的值如下:

60e3bcbff6c1464b8aed5be0fce86052
wd2eg0qa

wd2eg0qa1#

据我所知,Martijn的答案不是100%正确的,一个UUID-4有五组十六进制字符,第一组8个字符,第二组4个字符,第三组4个字符,第四组4个字符,第五组12个字符。
但是,要使其成为有效的UUID 4,第三组(中间的组)必须以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)
4nkexdtk

4nkexdtk2#

更具体地说,这是捕捉带破折号和不带破折号的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"返回真,而"3fc3d0e9 - 1efb-4eef-ace6-d9d59b62fec5 + 19187"返回假。

    • 更新-下面的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
6qftjkof

6qftjkof3#

很简单:

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

如果使用.match()方法(从字符串的开头开始搜索,请参见.search().match()),则只匹配 * 正好 * 32个十六进制字符的字符串。\Z匹配字符串的结尾(而$将匹配字符串的结尾 * 或 * 换行符)。

yks3o0rb

yks3o0rb4#

作为对性能问题的一个帮助说明,我测试了两种方法的执行时间,regex验证方法要快一些:

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]中:瓦尔= str(uuid.uuid4())
在[59]中:%time_validate_uuid4(val)CPU时间:用户0 ns,系统:0 ns,总计:0 ns壁时间:30.3 µs输出[59]:真的
在[60]中:%时间验证uuid4_re(val)CPU时间:用户0 ns,系统:0 ns,总计:0 ns壁时间:25.3 µs输出[60]:真的
在[61]中:瓦尔=“无效uuid”
在[62]中:%time_validate_uuid4(val)CPU时间:用户0 ns,系统:0 ns,总计:0 ns壁时间:29.3 µs输出[62]:假
在[63]中:%时间验证uuid4_re(val)CPU时间:用户0 ns,系统:0 ns,总计:0 ns壁时间:25.5 µs输出[63]:假

相关问题