2

我想验证一张 PAN 卡,它的前 5 个字符是字母,接下来的 4 个是数字,最后一个字符又是字母。我不能使用 isalnum() 因为我也想检查这个特定的顺序,而不仅仅是验证它是否同时包含数字和字母。

这是我的代码的片段:

def validate_PAN(pan):
    for i in pan:
        pan.isalpha(pan[0:4])==True:
            return 1
        pan.isdigit(pan[5:9])==True:
            return 1
        pan.isalpha(pan[9])==True:
            return 1
        else:
            return 0

这显然会返回错误,因为它是错误的。我怎样才能解决这个问题?

4

3 回答 3

3

只需进行字符串切片并检查

s[:5].isalpha()

pan[0:4]- 在这里您检查前 4 个字符而不是 5 个字符。

s[m:n]m- 这会将字符串从第一个字符切到n第一个字符(不包括n

您的代码中的错误

pan.isalpha(pan[0:4])==True

这会给您错误,因为isalpha()不接受任何参数并且您没有if在它之前使用。

你必须使用 -if pan[:5].isalpha() == True:

于 2021-07-03T09:20:13.413 回答
0

Regular expressions are a good fit for this.

import re

# Pattern for matching a PAN number
pattern = r'\b[A-Z]{5}[0-9]{4}[A-Z]\b'

# compile the pattern for better performance with repetitive matches
pobject = re.compile(pattern)

pan_number = "AXXMP1234Z"
result = pobject.match(pan_number)

if result:
    print ("Matched for PAN: ", res.group(0))
else:
    print("Failed")
于 2021-07-03T09:57:21.203 回答
0

regular expression为简单起见,您可以使用

import re

PAN_1 = 'ABCDE1111E'
PAN_2 = 'ABC1111DEF'

def is_valid_PAN(PAN_number):
    return bool(re.match(r'[a-z]{5}\d{4}[a-z]', PAN_number, re.IGNORECASE))

print(is_valid_PAN(PAN_1)) #True
print(is_valid_PAN(PAN_2)) #False
于 2021-07-03T09:33:33.487 回答