【问题标题】:How do I validate that user input is alphabetic or spaces in python?如何验证用户输入在 python 中是字母还是空格?
【发布时间】:2015-02-19 16:36:06
【问题描述】:

如何验证用户输入以限制他们只能输入字母字符? 我目前已经设置了这个 while 循环;

while True:
if message.isalpha():
    print ("You have chosen to " + decision.lower() + " " + message.lower() + ".")
    break
else:
    message = input("Please enter the message you wish to " + decision.lower() + " in alphabetical characters only.")

但是,我要验证的消息可以包含空格,如果消息是仅包含字母字符的句子,则结果将返回 false。

【问题讨论】:

  • 而不是str.isalpha,编写你自己的函数,它接受一个字符串并返回True,如果没问题,则返回False,然后使用它。

标签: python


【解决方案1】:

使用正则表达式

import re

if re.search("^[a-zA-Z\s]+$", message):
      print ("You have chosen to " + decision.lower() + " " + message.lower() + ".")
else:
     message = input("Please enter the message you wish to " + decision.lower() + " in alphabetical characters only.")

解释:

函数 re.search 试图在变量 message 中找到一个模式。如果找到,则代码进入 if 子句。该模式由正则表达式“^[a-zA-Z\s]+$”定义。为了理解,让我们划分表达式:

  • ^ 表示字符串的开头
  • a-z 表示从 a 到 z(小写)的任意字符
  • A-Z 表示从 A 到 Z(大写)的任意字符
  • \s 表示空格
  • + 表示一次或多次
  • $ 表示字符串的结尾

因为a-zA-Z\s都在方括号[]内,表示 >a-zA-Z\s。使用 +,我定义括号内的所有内容都可以出现一次或多次。因此,代码会尝试搜索任何出现一次或多次的小写字母、大写字母或空格。

【讨论】:

  • 我厌倦了它,它工作得很好,但是我不完全理解你发布的内容。你能解释一下 "if re.search("^[a-zA-Z\s]+$", message):" 的作用吗
  • 感谢您花时间解释
【解决方案2】:

你可以使用set:

import string

if set(message).issubset(string.ascii_lowercase + " "):
    print "Good one"

您可以在这两种情况下使用string.ascii_letters,等等。

【讨论】:

    【解决方案3】:

    经过测试,我最有效的方法(就时间而言)似乎是删除空间并使用str.isalpha

    if 'my text'.replace(' ', '').isalpha():
        print 'Good one'
    

    时间对比:

    >>> # My answer:
    >>> def test()
            'my text'.replace(' ', '').isalpha()
    >>> %timeit test()
    1000000 loops, best of 3: 336 ns per loop
    
    >>> # Stuart's answer:
    >>> def test()
            set(message).issubset(string.ascii_lowercase + " ")
    >>> %timeit test()
    100000 loops, best of 3: 2.17 us per loop
    
    >>> # Yuri's answer:
    >>> reg = re.compile("^[a-zA-Z\s]+$")
    >>> def test()
            reg.search('my text')
    >>> %timeit test()
    1000000 loops, best of 3: 504 ns per loop
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-26
      • 2020-03-20
      • 2023-03-29
      • 1970-01-01
      • 2019-12-05
      • 2016-03-05
      • 1970-01-01
      • 2021-01-14
      相关资源
      最近更新 更多