Regex - unikalne znaki w ciągu

0

W ramach nauki Pythona robię różne ćwiczenia znalezione w sieci. Obecnie z wyrażeń regularnych i utknąłem na jednym dotyczącym weryfikacji UIDa, który powinien spełniać następujące warunki:

A valid UID must follow the rules below:

* It must contain at least 2 uppercase English alphabet characters.
* It must contain at least 3 digits (0-9).
* It should only contain alphanumeric characters (a-z, A-Z  &  0-9).
* No character should repeat.
* There must be exactly 10 characters in a valid UID.

Zrobiłem coś takiego:

pattern = r'(([a-zA-Z0-9]){10})(?=(.*[A-Z]){2,})(?=(.*[0-9]){3,})'

Brakuje mi koncepcji na to jak zrobić by znaki nie powtarzały się we wzorcu. Jakieś pomysły, którego z operatorów użyć?
Intuicja podpowiada, że powinienem nazwać sobie jakoś grupę (?P<znak>[a-zA-Z0-9]) i użyć jednego z operatorów patrzenia w tył/przód, ale nie wiem czy to dobry kierunek.

1

Tylko ze ten regex nie działa jak należy, np a2cDe0Gh3i spełnia wymagania zadania, a regex go nie łapie.

1

To jest zadanie z Hacker Rank, które kiedyś zrobiłem, ale musialem wygooglać, co znaczy mój kod:-D:-D.
Tu Masz opisane czego trzeba użyć: https://www.regular-expressions.info/backref.html , odnośnie ostatniego warunku.
A chyba tyle mogę podpowiedzieć, że łatwiej będzie sprawdzać koniunkcję warunków oddzielnie...

0

Dzięki za linka. Koniunkcja warunków osobno jest kusząca, ale celem jest nauka tworzenia wyrażeń regularnych w pythonie, a nie samo rozwiązanie problemu :-)

1

Czyli Chcesz to zrobić jednym wyrażeniem regularnym. Okay, tylko Wiedz, że regexy niezbyt się lubią z operatorem and, przeciwnie do or, które jest |.
https://stackoverflow.com/questions/469913/regular-expressions-is-there-an-and-operator

1

Dla porządku, zadanie na HR zaliczyłem z następującym regexpem:

pattern = r'^(?=(.*[A-Z]){2})(?=(.*[0-9]){3,})(?!([a-zA-Z0-9]*(?P<znak>[a-zA-Z0-9])[a-zA-Z0-9]*(?P=znak)))([A-Z0-9a-z]{10})$'

To rzecz jasna tylko ćwiczenia, bo utrzymywanie wielu, złożonych reguł w regexp, to byłby koszmar :-)

@CaliforniaDreaming: dzięki za ten case a2cDe0Gh3i, znalazłem błąd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1