繁体   English   中英

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

[英]Validating an alphabetical AND numerical input in Python

我正在尝试为一个项目进行一些编码,在该项目中,我需要验证包含字母和数字字符的输入,像这样

“ harry23”

我想验证输入内容是否同时包含字母和数字字符,最好不要创建大量代码。 我学校也不热衷于下载复杂的库,因此,如果有一种自己编写代码的方法,而又不依赖于大量的mods,我将不胜感激。 谢谢!

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

如果您的字符串至少为一位,则此字符串将返回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"))

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

这是一个简单的示例:

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

您可以将基于交集的方法用于一些非常简洁,可扩展的代码:

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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM