如何验证值是否等于此代码生成的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)
希望这可以帮助!
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
匹配字符串(对比的端部$
,其将匹配在字符串的末尾或换行).