2016-07-10 28 views
6

Ich schreibe ein Programm, das eine Zeichenfolge als Eingabe nimmt und prüft, ob die darin enthaltenen Elemente gültig sind oder nicht. Ich möchte, dass meine Eingabe nur niedrigere Zeichen und Punkte, Ausrufezeichen und Leerzeichen und keine leere Zeichenfolge enthält. Wenn der Benutzer eine leere Zeichenfolge oder ein ungültiges Zeichen eingibt, werden sie aufgefordert, die Zeichenfolge erneut einzugeben:Auf ungültige Eingabe prüfen

Ich weiß, wie Sie nach einem Zeichen in einer Zeichenfolge suchen. Ich benutze diese Methode

alpha ="abcdefghijklmnopqrstuvwxyz" 
message= input("Enter message: ") 
for i in message: 
    if i in alpha: 
     print i 

Normalerweise werde ich unter die Methode für ungültige Eingaben zu überprüfen, aber es wird für diesen Fall nicht funktionieren, wenn ich für ein Zeichen in einer Zeichenfolge überprüfen möge. Ich kann das nur verwenden, um zu überprüfen, ob die Nachricht leer ist.

textOK = False 
while not textOK: 
     message= input(prompt) 
     if len(message) == 0: 
      print("Message is empty) 
     else: 
      textOK= True 

Dies wird den Benutzer erneut auffordern, wenn sie eine leere Zeichenfolge eingeben. Ich habe keine Ahnung, wie ich die beiden Methoden kombinieren soll. Kurz gesagt, ich möchte überprüfen, ob meine Eingabe nur aus Kleinbuchstaben, Punkten, Ausrufezeichen und Leerzeichen besteht. Wenn es andere Sonderzeichen oder Zahlen enthält oder eine leere Zeichenfolge ist, wird der Benutzer aufgefordert, die Nachricht erneut einzugeben. Bitte helfen Sie !!

+2

Verwendung regex; Import re –

Antwort

4

Sie können die Kontrolle eine Reihe von erlaubten Zeichen verwenden, wenn der Satz a Obermenge der Zeichenfolge eingegeben:

allowed = set("abcdefghijklmnopqrstuvwxyz! .") 

while True: 
    message = input("Enter message: ") 

    if message and allowed.issuperset(message): 
     # do whatever 
     break 
    print("Invalid characters entered!") 

Es wird nur erlauben, was in ist erlaubt:

In [19]: message = "foobar!!$ " 

In [20]: message and allowed.issuperset(message) 
Out[20]: False 

In [21]: message = "foobar!! " 

In [22]: message and allowed.issuperset(message) 
Out[22]: True 

In [23]: message = "" 

In [24]: bool(message and allowed.issuperset(message)) 
Out[24]: False 

Sie kann auch verwenden all()...:

while True: 
    message = input("Enter message: ") 
    if message and all(ch in allowed for ch in message): 
     print("ok") 
     break 
    print("Invalid characters entered!) 

Wenn Sie wa nt zur Ausgabe der schlechten Zeichen:

while True: 
    message = input("Enter message: ") 
    if message and all(ch in allowed for ch in message): 
     print("ok") 
     break 
    print("The following invalid character(s) were entered! {}" 
      .format(" ".join(set(message)- allowed))) 
+0

Danke! Aber wird mir diese Methode erlauben, einen Raum zu betreten? Ich brauche meine Nachricht, um Platz für die weitere Verwendung zu haben! –

+1

@ K.U sieht aus wie das Leerzeichen im Set enthalten ist - warum nicht einfach ausprobieren? – Levon

+0

@KU, ja ein Leerzeichen ist erlaubt, 'if message' wird Ihre leere Zeichenfolge abfangen, der Satz testet, dass nur was zulässig ist in der Zeichenfolge –

2
import re 
while True: 
    txt = input('Enter message: ').strip() 
    if re.match(r'^[a-z\. !]+$', txt): 
     break 

    print('Mistakes:', re.findall(r'[^a-z\. !]', txt)) 

print('correct!') 
+0

remove ** kommentieren.strip() ** Wenn du auch nur Leerzeichen akzeptierst –

+0

Ich weiß es klingt blöd, aber ich versuche, andere Sonderzeichen als "abcdefghijklmnopqrstuvwxyz!" zu finden. Das wird nur nach gültigen Zeichen suchen. Gibt es eine Möglichkeit, dass ich nach einem ungültigen Zeichen suchen kann, zum Beispiel kann ich es verwenden, wenn nicht re.match –

+0

Invert regex: [^ a-z \. !] Bitte beachten Sie, dass ich^und $ und + entfernt habe –

1

einen Blick Geben Sie bei string.punctuation Python-Funktion. Sie können auch festlegen, welche Eingaben erlaubt/nicht erlaubt sind.

1

eine erweiterte Regex, die nur korrekte Sätze erlaubt:

import re 
while True: 
    txt = input('Enter message: ').strip() 
    if re.match(r'^[a-z]+[\.\!]?([ ][a-z]+[\.\!]?)*$', txt): 
     break 

erlaubt:

ipsum. asd. 
dolor sit amet consectetur adipiscing elit! 
aenean libero risus consequat ac felis eget 
aenean facilisis tortor nunc et sollicitudin 
ut augue mauris tincidunt ut felis id mattis 
fusce vel diam nec tellus consequat lacinia 

wird nicht erlauben:

two spaces 
hey!! 
no!. 
!me 
! ! !