Estoy buscando UUID en bloques de texto usando una expresión regular. Actualmente confío en el supuesto de que todos los UUID seguirán un patrón de 8-4-4-4-12 dígitos hexadecimales.
¿Alguien puede pensar en un caso de uso donde esta suposición no sea válida y me haga perder algunos UUID?
Respuestas:
Estoy de acuerdo en que, por definición, su expresión regular no pierde ningún UUID. Sin embargo, puede ser útil tener en cuenta que si está buscando especialmente los identificadores únicos globales (GUID) de Microsoft, hay cinco representaciones de cadena equivalentes para un GUID:
fuente
La expresión regular para uuid es:
fuente
[a-f0-9]
! Como es hechizo! Su expresión regular (tal como está) podría devolver falsos positivos.@ivelin: UUID puede tener mayúsculas. Por lo tanto, necesitará toLowerCase () la cadena o 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}
Hubiera comentado esto pero no suficiente representante :)
fuente
/.../i
versión no lo hizo.fuente: http://en.wikipedia.org/wiki/Uuid#Definition
Por lo tanto, esto es técnicamente más correcto:
fuente
(:?8|9|A|B)
es probablemente un poco más legible como[89aAbB]
i
(sin distinción entre mayúsculas y minúsculas).Si desea verificar o validar una versión específica de UUID , aquí están las expresiones regulares correspondientes.
El número de versión es el primer carácter del tercer grupo
[VERSION_NUMBER][0-9A-F]{3}
:UUID v1:
UUID v2:
UUID v3:
UUID v4:
UUID v5:
fuente
a-f
lado de cadaA-F
ámbito.i
final de la expresión regular lo marca como mayúsculas y minúsculas.format
modificador configurándolo en "uuid" en lugar de usar una expresión regular para probar UUID: swagger.io/docs/specification/data-models/data-types/#formatLa expresión regular de Gajus rechaza UUID V1-3 y 5, aunque sean válidos.
fuente
[\w]{8}(-[\w]{4}){3}-[\w]{12}
me ha funcionado en la mayoría de los casos.O si quieres ser realmente específico
[\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}
.fuente
\w
generalmente significa "caracteres de palabras". Coincidirá mucho más que dígitos hexadecimales. Tu solución es mucho mejor. O, por compatibilidad / legibilidad, podría 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')
En python re, puede abarcar desde números numéricos a mayúsculas alfa. Entonces..
Eso hace que la expresión regular UUID de Python más simple:
Lo dejaré como un ejercicio para que el lector use timeit para comparar el rendimiento de estos.
Disfrutar. ¡Mantenlo Pythonic ™!
NOTA: Esos tramos también coincidirán
:;<=>?@'
, por lo tanto, si sospecha que podría darle falsos positivos, no tome el atajo. (Gracias Oliver Aubert por señalar eso en los comentarios).fuente
Por definición, un UUID tiene 32 dígitos hexadecimales, separados en 5 grupos por guiones, tal como lo ha descrito. No debes perderte ninguno con tu expresión regular.
http://en.wikipedia.org/wiki/Uuid#Definition
fuente
Entonces, creo que Richard Bronosky en realidad tiene la mejor respuesta hasta la fecha, pero creo que puede hacer un poco para que sea algo más simple (o al menos terser):
fuente
re_uuid = re.compile(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){4}[0-9a-f]{8}', re.I)
Variante para C ++:
fuente
Para UUID generado en OS X con
uuidgen
, el patrón regex esVerificar con
fuente
Por cierto, permitir solo 4 en una de las posiciones solo es válido para UUIDv4. Pero v4 no es la única versión de UUID que existe. También he conocido v1 en mi práctica.
fuente
Si usa Posix regex (
grep -E
, MySQL, etc.), esto puede ser más fácil de leer y recordar:fuente
Para bash:
Por ejemplo:
fuente