Je recherche des UUID dans des blocs de texte à l'aide d'une expression régulière. Actuellement, je me fie à l'hypothèse que tous les UUID suivront un modèle de 8-4-4-4-12 chiffres hexadécimaux.
Quelqu'un peut-il penser à un cas d'utilisation où cette hypothèse serait invalide et me ferait manquer certains UUID?
Réponses:
Je suis d'accord que par définition, votre regex ne manque aucun UUID. Cependant, il peut être utile de noter que si vous recherchez en particulier les identificateurs globaux uniques (GUID) de Microsoft, il existe cinq représentations de chaînes équivalentes pour un GUID:
la source
Le regex pour uuid est:
la source
[a-f0-9]
! Comme c'est hex! Votre regex (tel quel) pourrait retourner des faux positifs.@ivelin: UUID peut avoir des majuscules. Vous devrez donc soit toLowerCase () la chaîne ou utiliser:
[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}
Aurait juste commenté cela mais pas assez de représentants :)
la source
/.../i
version ne l'a pas fait.la source: http://en.wikipedia.org/wiki/Uuid#Definition
C'est donc techniquement plus correct:
la source
(:?8|9|A|B)
probablement un peu plus lisible[89aAbB]
i
indicateur (insensible à la casse).Si vous souhaitez vérifier ou valider une version UUID spécifique , voici les expressions rationnelles correspondantes.
Le numéro de version est le premier caractère du troisième groupe
[VERSION_NUMBER][0-9A-F]{3}
::UUID v1:
UUID v2:
UUID v3:
UUID v4:
UUID v5:
la source
a-f
côté de chaqueA-F
portée.i
à la fin de l'expression régulière le marque comme insensible à la casse.format
modificateur en le définissant sur "uuid" au lieu d'utiliser une expression régulièreL'expression régulière de Gajus rejette les UUID V1-3 et 5, même si elles sont valides.
la source
[\w]{8}(-[\w]{4}){3}-[\w]{12}
a travaillé pour moi dans la plupart des cas.Ou si vous voulez être vraiment précis
[\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}
.la source
\w
signifie généralement "caractères de mot". Il correspondra bien plus que les chiffres hexadécimaux. Votre solution est bien meilleure. Ou, pour la compatibilité / lisibilité que vous pourriez utiliser[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')
Dans python re, vous pouvez s'étendre du numérique au alpha majuscule. Alors..
Cela fait l'expression rationnelle UUID Python la plus simple:
Je laisserai au lecteur le soin d'utiliser timeit pour comparer les performances de ceux-ci.
Prendre plaisir. Gardez-le Pythonic ™!
REMARQUE: ces plages correspondent également
:;<=>?@'
. Si vous pensez que cela pourrait vous donner de faux positifs, ne prenez pas le raccourci. (Merci Oliver Aubert de l'avoir signalé dans les commentaires.)la source
Par définition, un UUID est composé de 32 chiffres hexadécimaux, séparés en 5 groupes par des tirets, comme vous l'avez décrit. Vous ne devriez pas en manquer avec votre expression régulière.
http://en.wikipedia.org/wiki/Uuid#Definition
la source
Donc, je pense que Richard Bronosky a en fait la meilleure réponse à ce jour, mais je pense que vous pouvez faire un peu pour le rendre un peu plus simple (ou au moins terser):
la source
re_uuid = re.compile(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){4}[0-9a-f]{8}', re.I)
Variante pour C ++:
la source
Pour les UUID générés sur OS X avec
uuidgen
, le modèle d'expression régulière estVérifiez avec
la source
BTW, autorisant seulement 4 sur l'une des positions n'est valable que pour UUIDv4. Mais la v4 n'est pas la seule version UUID qui existe. J'ai également rencontré la v1 dans ma pratique.
la source
Si vous utilisez l'expression rationnelle Posix (
grep -E
, MySQL, etc.), cela peut être plus facile à lire et à mémoriser:la source
Pour bash:
Par exemple:
la source