Проверка недопустимого ввода

Я пишу программу, которая будет принимать строку в качестве входных данных и проверять, являются ли элементы в ней допустимыми или нет. Я хочу, чтобы мой ввод содержал только нижние символы и точки, восклицательные знаки и пробел, а не пустую строку. Если пользователь вводит пустую строку или недопустимый символ, ему будет предложено снова ввести строку:

Я знаю, как проверить символ в строке. Я использую этот метод

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

обычно я буду использовать метод ниже, чтобы проверить для недопустимого ввода, но это не будет работать для этого случая, если я хочу проверить символ в строке. Я могу использовать это только для проверки, если сообщение пустое

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

это будет повторно запрашивать пользователя всякий раз, когда они вводят пустую строку. Я понятия не имею, как совместить эти два метода. Короче говоря,я хочу проверить, содержит ли мой ввод только нижние буквы, точки, восклицательные знаки и Пробел. Если он содержит другие специальные символы или числа или является пустой строкой, пользователю будет предложено введите сообщение еще раз. Пожалуйста, помогите!!

4 ответов


вы можете использовать набор разрешенных символов, проверяя, является ли набор superset введенной строки:

allowed = set("abcdefghijklmnopqrstuvwxyz! .")

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

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

Это позволит только то, что разрешается:

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

вы также можете использовать 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!)

если вы хотите вывести плохие символы:

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)))

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!')

взгляните на строку.пунктуация функция python. Вы также можете установить, какие входы разрешены / не разрешены.


более продвинутый регулярное выражение, которое позволяет только правильные предложения:

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

позволит:

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

будет не позволяет:

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