Regex - unikalne znaki w ciągu

Regex - unikalne znaki w ciągu
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:12 dni
  • Postów:2370
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:

Kopiuj
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:

Kopiuj
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.

CD
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
  • Postów:20
1

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

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około godziny
  • Postów:4935
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...


YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:12 dni
  • Postów:2370
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 :-)

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około godziny
  • Postów:4935
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


edytowany 3x, ostatnio: lion137
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:12 dni
  • Postów:2370
1

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

Kopiuj
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.

edytowany 1x, ostatnio: yarel
lion137
Cool, zapisuję sobie ot rozwiązanie, jako case study do tego linka ze stacka:)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.