如何在Python中检查UUID有效性?

问题描述 投票:0回答:5

我有一个应该是 UUID 的字符串。有没有内置的Python函数可以检查UUID是否有效以及检查其版本?

python uuid
5个回答
212
投票

我在寻找Python答案时发现了这个问题。为了帮助处于相同情况的人,我添加了 Python 解决方案。

您可以使用

uuid
模块:

#!/usr/bin/env python

from uuid import UUID

def is_valid_uuid(uuid_to_test, version=4):
    """
    Check if uuid_to_test is a valid UUID.
    
     Parameters
    ----------
    uuid_to_test : str
    version : {1, 2, 3, 4}
    
     Returns
    -------
    `True` if uuid_to_test is a valid UUID, otherwise `False`.
    
     Examples
    --------
    >>> is_valid_uuid('c9bf9e57-1685-4c89-bafb-ff5af830be8a')
    True
    >>> is_valid_uuid('c9bf9e58')
    False
    """
    
    try:
        uuid_obj = UUID(uuid_to_test, version=version)
    except ValueError:
        return False
    return str(uuid_obj) == uuid_to_test


if __name__ == '__main__':
    import doctest
    doctest.testmod()

57
投票

所有现有答案都使用正则表达式。如果您使用 Python,您可能需要考虑

try/except
,以防您不想使用正则表达式: (比上面的答案短一点)。

我们的验证器将是:

import uuid

def is_valid_uuid(val):
    try:
        uuid.UUID(str(val))
        return True
    except ValueError:
        return False

>>> is_valid_uuid(1)
False
>>> is_valid_uuid("123-UUID-wannabe")
False
>>> is_valid_uuid({"A":"b"})
False
>>> is_valid_uuid([1, 2, 3])
False
>>> is_valid_uuid(uuid.uuid4())
True
>>> is_valid_uuid(str(uuid.uuid4()))
True
>>> is_valid_uuid(uuid.uuid4().hex)
True
>>> is_valid_uuid(uuid.uuid3(uuid.NAMESPACE_DNS, 'example.net'))
True
>>> is_valid_uuid(uuid.uuid5(uuid.NAMESPACE_DNS, 'example.net'))
True
>>> is_valid_uuid("{20f5484b-88ae-49b0-8af0-3a389b4917dd}")
True
>>> is_valid_uuid("20f5484b88ae49b08af03a389b4917dd")
True

31
投票

要检查 UUID 字符串的有效性,只需尝试用它创建一个新的

uuid
对象即可。如果无效的话...

uuid.UUID("foo")
# => ValueError: badly formed hexadecimal UUID string

如果您需要知道 UUID 的版本,就在

UUID
API:

uuid.UUID('302a4299-736e-4ef3-84fc-a9f400e84b24').version
# => 4

9
投票
import re

UUID_PATTERN = re.compile(r'^[\da-f]{8}-([\da-f]{4}-){3}[\da-f]{12}$', re.IGNORECASE)
uuid = '20f5484b-88ae-49b0-8af0-3a389b4917dd'

return bool(UUID_PATTERN.match(uuid))

0
投票

我在研究一个对破折号有严格要求/没有封闭

{}
或前导
-
(基本上仍然可以标记为有效UUID的任何变体)的用例时遇到了这个问题,并改编了slajma/Pēteris Caune上面的答案当 1) UUID 有效且 2) UUID 符合预期格式时返回 True:

def is_valid_uuid(val):
    try:
        return str(UUID(str(val))) == str(val)
    except ValueError:
        return False
>>> is_valid_uuid({1, 2, 3, 4})
False
>>> is_valid_uuid([1, 2, 3])
False
>>> is_valid_uuid({'A': 'b'})
False
>>> is_valid_uuid('foo')
False
>>> is_valid_uuid('c9bf9e58')
False
>>> is_valid_uuid('c9bf9e57-1685-4c89-bafb-ff5af830be8a')
True
>>> is_valid_uuid('20f5484b88ae49b08af03a389b4917dd')
False
>>> is_valid_uuid('{20f5484b-88ae-49b0-8af0-3a389b4917dd}')
False
>>> is_valid_uuid('2830fe32-ac06-4b1d-aed4-b9f6472c10a4')
True
© www.soinside.com 2019 - 2024. All rights reserved.