2016-07-10 48 views
6

Sto scrivendo un programma che prenderà una stringa come input e controllerà se gli elementi in esso sono validi o meno. Desidero che il mio input contenga solo caratteri e punti inferiori, punti esclamativi e spazio e non una stringa vuota. Se l'utente immette una stringa vuota o un carattere non valido, verrà chiesto di reinserire nuovamente la stringa:Verificare l'input non valido

So come verificare un carattere in una stringa. Io uso questo metodo

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

solito userò il metodo seguito per verificare la presenza di input non valido, ma non funziona per questo caso se voglio verificare la presenza di un carattere in una stringa. Posso solo usare questo per controllare se il messaggio è vuoto

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

Ciò ri chiederà all'utente ogni volta che ingresso una stringa vuota. Non ho idea di come combinare i due metodi. In breve, voglio controllare se il mio input contiene solo lettere minuscole, punti, punti esclamativi e spazio. Se contiene altri caratteri speciali o numeri o è una stringa vuota, l'utente sarà invitato a inserire nuovamente il messaggio. Per favore aiuto !!

+2

uso regex; import re –

risposta

4

È possibile utilizzare un set di caratteri consentiti di controllo se l'insieme è un superset della stringa immessa:

allowed = set("abcdefghijklmnopqrstuvwxyz! .") 

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

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

Permetterà solo ciò che è in permesso:

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 

È può anche utilizzare 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!) 

Se si desidera NT Per emettere i cattivi caratteri:

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

Grazie! Ma questo metodo mi consentirà di entrare in uno spazio? Ho bisogno del mio messaggio per avere spazio per un ulteriore utilizzo! –

+1

@ K.U sembra che il carattere dello spazio sia incluso nel set - perché non provarlo? – Levon

+0

@KU, sì uno spazio è consentito, 'se il messaggio' cattura la stringa vuota, l'insieme verifica che solo ciò che è consentito è nella stringa –

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

rimuovere **.strip() ** se si accettano solo spazi come –

+0

So che sembra stupido ma sto cercando di rilevare caratteri speciali diversi da "abcdefghijklmnopqrstuvwxyz!". Questo controllerà solo il carattere valido. Esiste un modo in cui posso verificare la presenza di caratteri non validi, ad esempio posso usare se non re.match –

+0

invertire regex: [^ a-z \. !] si noti che ho rimosso^e $ e + –

1

dare uno sguardo al string.punctuation funzione Python. È inoltre possibile impostare quali ingressi sono consentiti/non consentiti.

1

una regex più avanzato che consente solo frasi corrette:

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

consentiranno:

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 

sarà non permettere:

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