在Python中验证字母和数字输入

时间:2017-11-22 14:48:43

标签: python validation

我正在尝试为项目编写一些代码,我需要验证包含字母和数字字符的输入,例如

“harry23”

我想验证以确保输入具有BOTH字母和数字字符,理想情况下不会创建大量代码。我的学校也不热衷于下载复杂的库,所以如果有一种方法可以自己编写代码而不依赖于大量的mod,我会很感激。 谢谢!

3 个答案:

答案 0 :(得分:2)

我认为你创建了两个这样的函数:

如果您的字符串至少为一位数

,则返回true
>>> def hasNumbers(inputString):
...     return any(char.isdigit() for char in inputString)

如果你至少将字符串作为一个字符串

,那么这个将返回true
>>> def hasChar(inputString):
...     return any(char.isalpha() for char in inputString)

你可以通过

来检查它是否同时存在
if(hasNumbers("Charlie123") and hasChar("Charlie123"))

答案 1 :(得分:0)

您可以随时尝试使用子字符串检查进行验证。如果需要,你可以改变它们以包括大小写和数字。

这是一个简单的例子:

if "substring" not in somestring: 
     print("Error!")

您可以将其置于while True循环中并具有ValueError子句。

while True:
     try:
          //input
     if "substring" not in somestring:
          continue
     except ValueError:
          continue:
     else:
          break

答案 2 :(得分:0)

您可以使用基于交集的集合方法来实现一些非常简洁的方法, 可扩展代码:

import string

letters = set(string.ascii_letters)
nums = set(string.digits)

def has_alnum(word):
    chars = set(word)
    return chars & letters and chars & nums

如果您对速度特别感兴趣,那么它可能会更快 手写出循环:

def loop_has_alnum(word):
    letter = False
    num = False
    for ch in word:
        if ch in letters:
            if num:
                return True
            letter = True
        elif ch in nums:
            if letter:
                return True
            num = True
    return False

将这些放在ipy文件中后,我做了一些测试:

words = ["harry23", "a1", "8aaaa", "bbb0", "abc", "jim", "123"]

for word in words:
    print("{:7} - {!s:5} - {}".format(word, bool(has_alnum(word)), loop_has_alnum(word)))

print("timing sets:")

%timeit [has_alnum(word) for word in words]

print("timing loop:")

%timeit [loop_has_alnum(word) for word in words]

具有以下结果:

harry23 - True  - True
a1      - True  - True
8aaaa   - True  - True
bbb0    - True  - True
abc     - False - False
jim     - False - False
123     - False - False
timing sets:
3.32 µs ± 13.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
timing loop:
2.47 µs ± 130 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

证明他们都同意,但循环速度要快一些。