Python字符串字母和数字检查

时间:2018-02-20 14:24:29

标签: python string slice

我正在写一个简单的代码,应该确定汽车的牌照,并说明它是旧的还是新的。 用户输入一个字符串(例如:“ABC123”或“1234POW”),程序应该返回一个带有相应值的字符串:“New”或“Old”

所以,问题是:

l = input("Enter your license plate: ")
if len(l) == 6:
    if l[0] and l[1] and l[2] in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
        if l[3]and l[4]and l[5] in "1234567890":
            print("You have a license plate of an old type")
        else:
            print("The plate is not valid. Check your input")
    else:
        print("The plate is not valid. Check your input")
elif len(l) == 7:
    if l[0:4] in "1234567890":
        if l[4:7] in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
        print("You have a license plate of a new type")
    else:
        print("Your plate is not valid, check your input+")

否则:     print(“这看起来不像有效的牌号”)

第11行和第12行:我不知道为什么,但我没有打印“新类型”消息,而是“你的盘子无效,请检查输入+”。

但如果我将第12行更改为“如果l [4]和l [5]以及”ABCDEFGHIJKLMNOPQRSTUVWXYZ中的[6] - 一切正常。

感谢您的解释,请原谅,如果我发布了某些内容或某种错误 - 我是新来的:D 谢谢。

3 个答案:

答案 0 :(得分:3)

l[4:7]是一个长度为3的字符串。因此,假设l"1234POW",则l[4:7]"POW"。您的长字符串"ABCDEFGHIJKLMNOPQRSTUVWXYZ" 包含子字符串"POW"

如果要检查长字符串中的每个字符序列,可以使用函数all

if all(ch in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" for ch in l[4:7]):
    ...

甚至只是

 if l[4:7].isupper():

您已离开l[0:4] in "1234567890",因为"1234" "1234567890"的确切子字符串。如果您有不同的数字,那就不会有效,原因与上述相同。

相反,您可以使用:

if l[:4].isdigit() and l[4:7].isupper():

另一方面,你的上限

if l[0] and l[1] and l[2] in "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

也错了。 Python将此理解为

if (l[0]) and (l[1]) and (l[2] in "ABCDEFGHIJKLMNOPQRSTUVWXYZ")

if l[0] is not zero
   and l[1] is not zero
   and l[2] is in "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

所以你的上限也应该改变:

e.g。

if l[:3].isupper() and l[3:6].isdigit():
    ...

答案 1 :(得分:0)

这通常是一个正则表达式问题。 https://docs.python.org/3/library/re.html

试试这样的事情:

import re

new_plate_re = re.compile(r'^\D{3}\d{3}$')
old_plate_re = re.compile(r'^\d{3}\D{3}$')

def check_plate(plate_num):
    match_new = new_plate_re.match(plate_num)
    if match_new is not None:
        print("You have a license plate of a new type")
        return
    match_old = old_plate_re.match(plate_num)
    if match_old is not None:
        print("You have a license plate of a old type")
        return
    print("Unknown format!")

答案 2 :(得分:0)

凯尔伍德的回答非常好,但这只是一个替代方案,因为当你学习它时,通常会看到几种技巧。您可以将字符串中的初始字符转换为Python set。构建集合的最简单方法是使用其他人所说的切片,然后调用set()函数。总的来说,它看起来像这样:

if set(l[0:3]).issubset("ABCDEFGHIJKLMNOPQRSTUVWXYZ"):
    if set(l[3:6]).issubset("1234567890"):
       # ...