检查无效输入

7
我正在编写一个程序,它会接受一个字符串作为输入,并检查其中的元素是否有效。我希望我的输入只包含小写字母、句号、感叹号和空格,而不是空字符串。如果用户输入了空字符串或无效字符,则会要求他们重新输入字符串:
我知道如何检查字符串中的字符。我使用这个方法:
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

这将在用户输入空字符串时重新提示他们。我不知道如何结合这两种方法。简而言之,我想检查我的输入是否仅包含小写字母、句号、感叹号和空格。如果它包含其他特殊字符或数字或为空字符串,则会提示用户再次输入消息。 请帮忙!

2
使用正则表达式;导入 re。 - Szabolcs Dombi
4个回答

6

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

allowed = set("abcdefghijklmnopqrstuvwxyz! .")

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

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

它只会允许在“allowed”列表中的内容:

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
@K.U 看起来空格字符已经包含在集合中了 - 为什么不试一下呢? - Levon
@K.U,是允许有一个空格的。if message会捕捉到你的空字符串,集合测试仅检查字符串中允许的内容是否存在。 - Padraic Cunningham
@K.U,你用的是哪个版本的Python? - Padraic Cunningham
1
Python 3.5.0 是我所拥有的。 - K.U
我的错,我以为我在问题下面进行评论。 - Szabolcs Dombi
显示剩余3条评论

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

如果您只接受空格,请删除.strip()。 - Szabolcs Dombi
我知道这听起来很蠢,但我正在尝试检测除“abcdefghijklmnopqrstuvwxyz! .”之外的特殊字符。这只会检查有效字符。有没有一种方法可以检查无效字符,例如我可以使用if not re.match? - K.U
反转正则表达式:[^a-z. !] 请注意我已经移除了 ^、$ 和 +。 - Szabolcs Dombi

1
请看python函数string.punctuation。你还可以设置哪些输入是允许/不允许的。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接