3

我有一个简单的问题。我只是想知道如何让我的程序读取“input()”并查看字符串中是否有整数或任何类型的数字,如果有,则打印出一条消息。几乎我只是想知道如何确保没有人为他们的名字输入数字。谢谢!

yn = None
while yn != "y":
    print("What is your name?")
    name = input()
    print("Oh, so your name is {0}? Cool!".format(name))
    print("Now how old are you?")
    age = input()
    print("So your name is {0} and you're {1} years old?".format(name, age))
    print("y/n?")
    yn = input()
    if yn == "y":
        break
    if yn == "n":
        print("Then here, try again!")
print("Cool!")
4

3 回答 3

3

查看字符串中是否有整数或任何类型的数字

any(c.isdigit() for c in name)

返回True诸如“123”、“123.45”、“abc123”之类的字符串。

于 2013-05-06T13:25:16.443 回答
3

在字符串上使用str.isdigit()方法,以及any()函数

if any(c.isdigit() for c in name):
    # there is a digit in the name

.isdigit()返回True仅由数字组成的任何字符串。这包括任何标记为数字或数字小数的 Unicode 字符。

any()循环遍历您传入的序列,并在True找到第一个元素时立即返回TrueFalse如果所有元素都是False.

演示:

>>> any(c.isdigit() for c in 'Martijn Pieters')
False
>>> any(c.isdigit() for c in 'The answer is 42')
True
于 2013-05-06T13:25:58.643 回答
2

根据字符串,正则表达式实际上可能更快:

import re

s1 = "This is me"
s2 = "this is me 2"
s3 = "3 this is me"

regex = re.compile(r'\d')
import timeit
def has_int_any(s):
    return any(x.isdigit() for x in s)

def has_int_regex(s,regex=re.compile(r'\d')):
    return regex.search(s)

print bool(has_int_any(s1)) == bool(has_int_regex(s1))
print bool(has_int_any(s2)) == bool(has_int_regex(s2))
print bool(has_int_any(s3)) == bool(has_int_regex(s3))


for x in ('s1','s2','s3'):
    print x,"any",timeit.timeit('has_int_any(%s)'%x,'from __main__ import has_int_any,%s'%x)
    print x,"regex",timeit.timeit('has_int_regex(%s)'%x,'from __main__ import has_int_regex,%s'%x)

我的结果是:

True
True
True
s1 any 1.98735809326
s1 regex 0.603290081024
s2 any 2.30554199219
s2 regex 0.774269104004
s3 any 0.958808898926
s3 regex 0.656207084656

any(请注意,即使在专门设计为最快的情况下,正则表达式引擎也会获胜)。但是,如果字符串更长,我愿意打赌any最终会更快。

于 2013-05-06T13:40:06.063 回答