我正在尝试为项目编写一些代码,我需要验证包含字母和数字字符的输入,例如
“harry23”
我想验证以确保输入具有BOTH字母和数字字符,理想情况下不会创建大量代码。我的学校也不热衷于下载复杂的库,所以如果有一种方法可以自己编写代码而不依赖于大量的mod,我会很感激。 谢谢!
答案 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)
证明他们都同意,但循环速度要快一些。