我回答的问题要求您验证Car Reg Plate。它必须查找两个字母的序列,然后是三个数字,然后是三个字母,否则返回一条消息,如"不是有效的邮政编码"
我需要知道如何通过将字符串与列表进行比较来检查字符串是否包含某个字母或数字。
到目前为止,我已经得到了这个:
# Task 2
import random
import re
def regNumber():
# Generate a Car Reg Number
letters = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
numbers = ["1","2","3","4","5","6","7","8","9","0"]
letter1 = random.choice(letters)
letter2 = random.choice(letters)
number1 = random.choice(numbers)
number2 = random.choice(numbers)
letter3 = random.choice(letters)
letter4 = random.choice(letters)
letter5 = random.choice(letters)
licensePlate = (letter1 + letter2 + number1 + number2 + letter3 + letter4 + letter5)
return licensePlate, letters, numbers
carReg, letters, numbers = regNumber()
print(carReg)
if letters not in carReg: print("Success")
然而,我收到此错误:
TypeError: 'in <string>' requires string as left operand, not list
任何帮助表示感谢。
答案 0 :(得分:4)
您需要使用此方法检查字符串中的字符,它不会简单地为您重复列表。
尝试使用类似的东西来检查字符串列表中的每个字符:
if any(letter in carReg for letter in letters):
这将删除第一个True
,这就是我认为您正在寻找的内容。
注意: 如果您使用any
这个不熟悉的领域,您也可以随时迭代字符串列表中的每个字符串以进行检查对于那些给定的角色。
更新: 如果您尝试匹配给定格式的字母和数字,那么让您熟悉自己会更有意义(恕我直言)使用Python的 regex 方法来模拟匹配到有效的牌照,而不是尝试使用循环来验证一个。我不会为你的特定情况编写正则表达式,但为了给你一个想法,以下内容可以让你匹配3个字母后跟1-4个数字(有效的车牌,其中我直播)
match_plate = re.compile(r"^[A-Z]{3}\d{1,4}$",re.I)
如果您确实必须使用列表进行检查,则必须使用一系列条件语句将牌照拆分为可以通过迭代验证的部分。
答案 1 :(得分:1)
错误告诉您这种情况下的确切问题,
letters
是从regNumber
退回的列表,但in
需要左侧的字符串
喜欢'ASD111' in carReg
答案 2 :(得分:1)
变化
if letters not in carReg: print("Success")
到
for l in letters:
if l not in carReg:
print("Success")
在您的代码中,您有一个字符串列表,这就是为什么我已将if条件更改为for循环,以便检查列表中的每个元素是否出现在carReg字符串中。
或者,我认为你应该使用一个标志来解决你的探测器。像这样:
flag = 0
for l in letters:
if l in carReg:
flag = 1
break
if flag == 0:
print("Success")
答案 3 :(得分:0)
你可以在没有正则表达式的情况下完成:
使用列表中的str
方法
pattern = [str.isalpha, str.isalpha,
str.isdigit, str.isdigit, str.isdigit,
str.isalpha, str.isalpha, str.isalpha]
使用该模式检查字符串。
def is_foo(pattern, s):
'''Return True if s matches pattern
s is a string
pattern is a list of functions that return a boolean
len(s) == len(pattern)
each function in pattern is applied to the corresponding character in s
'''
# assert len(s) == len(pattern)
return all(f(c) for f, c in zip(pattern, s))
用法
if is_foo(pattern, 'aa111aaa'):
print 'yes!!!'
if not is_foo(pattern, '11aa111'):
print ':('
答案 4 :(得分:0)
另一种可以生成一定数量字母而不必使用这么多变量的方法是仅使用两个变量来生成第一个,2个字母和第二个3个字母。 我将如何实现这一点的一个例子是:
def randomLetters1(y):
return ''.join(random.choice(string.ascii_uppercase) for x in range(y))
firstLetters = (randomLetters1(2))
secondLetters = (randomLetters1(3))
我知道这是因为我必须完成同样的任务。