2016-06-29 9 views
-1

Ich habe den folgenden regulären Ausdruck:.Positive vorwärtsgerichtete Behauptung und * Zeichen in Python

passw = re.compile(r'^(?=.*\d)(?=.*[A-Z])(?=.*[\$|\?\!])[A-Za-z\d$!&]{8}$') 

, die ich als String der Länge interpretieren kann 8, die mindestens eine Zahl, einen großen Brief und einer der enthalten muss Zeichen ($ ?!). Und besteht auch nur aus Zahlen, Buchstaben und $?!.

? = - Dieses Symbol wird als Lookahead Assertion bezeichnet: Zum Beispiel passt Isaac (?=Asimov) nur dann 'Isaac ', wenn es von 'Asimov' gefolgt wird.

Aber wie können wir .* Zeichen interpretieren? Was bedeutet es in Regex? Können wir es in dieser Situation vermeiden?

+2

'*' nicht ein Zeichen ist. Es ist das '.' Zeichen (bedeutet" irgendein Zeichen ") und das' * 'Zeichen (das bedeutet" irgendeine Anzahl von denen (einschließlich null) "). Also '. *' Bedeutet "beliebig viele Zeichen". – khelwood

+0

'. *' Passt auf jedes Zeichen (außer Newline) zwischen null und unbegrenzten Zeiten. –

+0

Gibt es einen Grund, warum Sie versuchen, all diese Prüfungen in einem einzigen regulären Ausdruck durchzuführen? Haben Sie darüber nachgedacht, zwei oder drei separate Prüfungen durchzuführen, die einfacher zu lesen und zu warten sind als ein langer Regex? –

Antwort

0

Tatsächlich .* bedeutet Null oder mehr Vorkommen eines beliebigen Zeichens, und wenn es mit einem speziellen Muster in einem Lookahead folgt, bedeutet dies, dass die Regex-Engine bestätigt, dass die Regex übereinstimmen kann. Und wenn du .* vor deinem Muster verwendest, sagst du der Regex-Engine, dass sie mit meinem Muster übereinstimmt, das null oder mehr Zeichen vorausgeht. Das heißt, du willst sicher sein, dass dein Muster in deiner Zeichenfolge vorhanden ist (von vorne nach hinten). Hier

ist ein Beispiel mit Diagramm.

(?=.*\d)[a-z]+ 

Regular expression visualization

Debuggex Demo