2017-09-19 1 views
1

Ich muss func schreiben, um str zu überprüfen. Wenn als nächste Bedingung passen:Python: Prüfe String mit re.match

1) str sollte beginnt mit Alphabet - ^[a-zA-Z]

2) str kann, enthält Alphabet, Zahlen, eine . und eine -

3) str sollte Alphabet endet oder Nummer

4) Länge von str aus 1 zu 50

def check_login(str): 
    flag = False 
    if match(r'^[a-zA-Z][a-zA-Z0-9.-]{1,50}[a-zA-Z0-9]$', str): 
     flag = True 
    return flag 

sein sollte, aber es sh Sollte bedeuten, dass es mit dem Alphabet beginnt, die Länge [a-zA-Z0-9.-] ist mehr als 0 und weniger 51 und endet mit [a-zA-Z0-9]. Wie kann ich die Menge von . und - begrenzen und Längenlimit für alle Ausdrücke schreiben?

Ich meine, dass a - True zurückgegeben werden soll, qwe123 auch wahr.

Wie kann ich das beheben?

Antwort

2

Sie Lookaheads brauchen:

^        # start of string 
    (?=^[^.]*\.?[^.]*$)  # not a dot, 0+ times, a dot eventually, not a dot 
    (?=^[^-]*-?[^-]*$)   # same with dash 
    (?=.*[A-Za-z0-9]$)   # [A-Za-z0-9] in the end 
    [A-Za-z][-.A-Za-z0-9]{,49} 
$ 

Siehe a demo on regex101.com.


die in Python könnte sein:

import re 

rx = re.compile(r''' 
^      # start of string 
    (?=^[^.]*\.?[^.]*$) # not a dot, 0+ times, a dot eventually, not a dot 
    (?=^[^-]*-?[^-]*$) # same with dash 
    (?=.*[A-Za-z0-9]$) # [A-Za-z0-9] in the end 
    [A-Za-z][-.A-Za-z0-9]{,49} 
$ 
''', re.VERBOSE) 

strings = ['qwe123', 'qwe-123', 'qwe.123', 'qwe-.-123', '123-'] 

def check_login(string): 
    if rx.search(string): 
     return True 
    return False 

for string in strings: 
    print("String: {}, Result: {}".format(string, check_login(string))) 

Dies ergibt:

String: qwe123, Result: True 
String: qwe-123, Result: True 
String: qwe.123, Result: True 
String: qwe-.-123, Result: False 
String: 123-, Result: False 
+0

'.123' (und der Familie)? – CristiFati

+0

@CristiFati: Der Demo-Link wurde aktualisiert (anfänglich die falsche Version). – Jan

+0

Aber wenn ich ein Alphabet-Symbol zum Beispiel "q" überprüfe, gibt es False zurück, aber es sollte True –