如何验证某个值是否等于此代码生成的UUID4?
uuid.uuid4().hex
它应该是一些正则表达式吗?由此形式的32个字符长的字符串生成的值:
60e3bcbff6c1464b8aed5be0fce86052
答案 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]:错