2017-09-04 4 views
-1

Je suis en train d'obtenir un regex pour les conditions suivantes:Problème avec la combinaison multiple regex lookahead en Python

Valider ID de l'utilisateur avec les conditions suivantes:

  1. Il doit contenir au moins 2 caractères de l'alphabet anglais en majuscules .
  2. Il doit contenir au moins 3 chiffres
  3. Il ne doit contenir que des caractères alphanumériques
  4. Aucun personnage doit se répéter.
  5. Il doit y avoir exactement 10 caractères dans un UID valide.

Le Regex qui fonctionne quand je mets vérifier séparément, mais combinés:

^(?=[a-zA-Z0-9]{10}$).*?(?=[A-Z][^A-Z]*?[A-Z]).*?(?=\d\D*?\d\D*?\d).* 

Quelqu'un pourrait-il s'il vous plaît expliquer pourquoi cela ne fonctionne pas?

travail une fois mis chaque condition séparée:

a. re.findall(r'^(?=[a-zA-Z0-9]{10}$)', inp)

b. re.findall(r'(?=[A-Z][^A-Z]*?[A-Z])', inp) ...

+0

Quelle serait la bonne sortie pour __AT934j3Cn8__? Celui-là devrait aller bien. Cependant, essayez re.compile (r '^ (? = [A-zA-Z0-9] {10} $) | (? = [AZ] [^ AZ]? [AZ]) | (? = \ D \ D? \ D \ D *? \ D). * ') – anki

+0

* Aucun caractère ne doit répéter. * Dans la chaîne entière ou juste l'un à côté de l'autre? – dawg

+0

Ce n'est pas un bon problème à résoudre avec des expressions régulières. Lors de la vérification d'un caractère spécifique, votre programme doit "se souvenir" de trop de choses ("ce caractère était-il déjà utilisé, ai-je déjà une autre majuscule?" Etc.) Les expressions régulières ne vérifient pas les occurrences de valeurs précédentes. Je voudrais essayer une autre approche (par exemple, compter manuellement les caractères dans les dictionnaires.) – brandizzi

Répondre

0

vous pouvez utiliser la regex

(?!.*(.).*\1)(?=.*[A-Z].*[A-Z])(?=.*\d.*\d.*\d)[a-zA-Z0-9]{10} 

voir le regex101 demo.

(?!. (.). \ 1) fait en sorte qu'aucun caractère est répété
(? =. [AZ]. [AZ]) garantit qu'au moins deux char majuscule sont présents
(? =. \ d. \ d. * \ d) assure au moins 3 chiffres sont présents
[a-zA-Z0-9] {10} correspond à 10 caractères alphanumériques

+0

Merci pour le code pour quelque chose que j'ai appris. Mais, pourriez-vous s'il vous plaît expliquer quelle est la faille dans mon approche avec plusieurs lookahead combinés (comme indiqué dans ma question initiale)? – Matiz

0

est ici une expression régulière comme vous décrivez:

/(?=(?:.*[A-Z].*){2,})(?=(?:.*\d.*){3,})(?!=(.).*\1)(^[a-zA-Z0-9]{10}$)/ 

Demo

+0

Merci @dawg. Je pense que je devrais être plus spécifique à ma question, Ma question n'est pas de résoudre le problème, essayez plutôt de comprendre pourquoi mon lookahead combiné ne fonctionne pas et l'autre avec lookahead individuel travaillé – Matiz

+0

Il y a un lien (sous 'Démo ') qui vous amène à un site regex interactif. Regardez une expression rationnelle de travail, puis déboguez celle que vous essayez de comprendre. Modifiez votre question si vous obtenez des réponses différentes de ce que vous cherchez. – dawg