检查无效输入

时间:2016-07-10 14:53:28

标签: python while-loop caesar-cipher invalid-characters

我正在编写一个程序,它将字符串作为输入并检查其中的元素是否有效。 我希望我的输入只包含较低的字符和句点,感叹号和空格,而不是空字符串。如果用户输入空字符串或无效字符,则会要求他们再次输入字符串:

我知道如何检查字符串中的字符。我用这个方法

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 个答案:

答案 0 :(得分:4)

您可以使用一组允许的字符来检查该字符集是否是输入字符串的超集

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

答案 1 :(得分: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!')

答案 2 :(得分:1)

查看 string.punctuation python函数。您还可以设置允许/不允许的输入。

答案 3 :(得分:1)

一个更高级的正则表达式,只允许正确的句子:

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