Estou procurando por UUIDs em blocos de texto usando um regex. Atualmente, estou confiando na suposição de que todos os UUIDs seguirão um padrão de 8-4-4-4-12 dígitos hexadecimais.
Alguém pode pensar em um caso de uso em que essa suposição seria inválida e me faria perder alguns UUIDs?
Respostas:
Concordo que, por definição, seu regex não perde nenhum UUID. No entanto, pode ser útil observar que, se você estiver pesquisando especialmente os GUIDs (Globally Unique Identifiers) da Microsoft, há cinco representações de seqüência de caracteres equivalentes para um GUID:
fonte
O regex para uuid é:
fonte
[a-f0-9]
! Como é hexadecimal! Seu regex (como está) pode retornar falsos positivos.@ivelin: UUID pode ter maiúsculas. Então você precisará toLowerCase () a string ou usará:
[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Teria acabado de comentar isso, mas não o suficiente rep :)
fonte
/.../i
versão não.fonte: http://en.wikipedia.org/wiki/Uuid#Definition
Portanto, isso é tecnicamente mais correto:
fonte
(:?8|9|A|B)
é provavelmente um pouco mais legível como[89aAbB]
i
sinalizador (sem distinção entre maiúsculas e minúsculas).Se você deseja verificar ou validar uma versão UUID específica , aqui estão as regexes correspondentes.
O número da versão é o primeiro caractere do terceiro grupo
[VERSION_NUMBER][0-9A-F]{3}
:UUID v1:
UUID v2:
UUID v3:
UUID v4:
UUID v5:
fonte
a-f
ao lado de cadaA-F
escopo.i
no final do regex o marca como sem distinção entre maiúsculas e minúsculas.format
modificador configurando-o para "uuid" em vez de usar um regex para testar UUIDs: swagger.io/docs/specification/data-models/data-types/#formatO regexp de Gajus rejeita UUID V1-3 e 5, mesmo que eles sejam válidos.
fonte
[\w]{8}(-[\w]{4}){3}-[\w]{12}
funcionou para mim na maioria dos casos.Ou se você quiser ser realmente específico
[\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}
.fonte
\w
geralmente significa "caracteres de palavras". Ele corresponderá a muito mais do que dígitos hexadecimais. Sua solução é muito melhor. Ou, para compatibilidade / legibilidade que você pode usar[a-f0-9]
import re def valid_uuid(uuid): regex = re.compile('[\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}', re.I) match = regex.match(uuid) return bool(match) valid_uuid('2wtu37k5-q174-4418-2cu2-276e4j82sv19')
No python re, você pode abranger de alfa numérico a maiúsculo. Assim..
Isso torna a regex UUID do Python mais simples:
Vou deixar como um exercício para o leitor usar o timeit para comparar o desempenho deles.
Aproveitar. Mantenha-o Pythonic ™!
OBSERVAÇÃO: esses intervalos também corresponderão
:;<=>?@'
; se você suspeitar que isso possa dar falsos positivos, não use o atalho. (Obrigado Oliver Aubert por apontar isso nos comentários.)fonte
Por definição, um UUID tem 32 dígitos hexadecimais, separados em 5 grupos por hífens, exatamente como você descreveu. Você não deve perder nada com sua expressão regular.
http://en.wikipedia.org/wiki/Uuid#Definition
fonte
Então, acho que Richard Bronosky realmente tem a melhor resposta até o momento, mas acho que você pode fazer um pouco para torná-lo um pouco mais simples (ou pelo menos terso):
fonte
re_uuid = re.compile(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){4}[0-9a-f]{8}', re.I)
Variante para C ++:
fonte
Para UUID gerado no OS X com
uuidgen
, o padrão regex éVerifique com
fonte
BTW, permitir apenas 4 em uma das posições é válido apenas para UUIDv4. Mas a v4 não é a única versão UUID que existe. Também conheci a v1 na minha prática.
fonte
Se você estiver usando o Regex Posix (
grep -E
MySQL, etc.), pode ser mais fácil ler e lembrar:fonte
Para o bash:
Por exemplo:
fonte