Python 使用正则表达式验证银行账号
在日常生活中,我们经常需要对一些银行账号进行校验,以确保其格式和位数符合标准,避免出现错误和安全问题。在 Python 中,我们可以使用正则表达式来进行银行账号的验证,提高代码的可读性和效率。
正则表达式的基本语法
正则表达式是一种用来描述字符串模式的语法,可以用于匹配、查找、替换等操作。在 Python 中,我们可以使用 re 模块来进行正则表达式的操作。
下面是一些常用的正则表达式的基本语法:
字符 | 描述 |
---|---|
. | 匹配任意字符,除了换行符 |
\w | 匹配字母、数字、下划线、汉字 |
\s | 匹配空白字符,包括空格、制表符、换行符等 |
\d | 匹配数字 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
* | 匹配前面的字符 0 次或多次 |
+ | 匹配前面的字符 1 次或多次 |
? | 匹配前面的字符 0 次或 1 次 |
{n} | 匹配前面的字符恰好 n 次 |
{n,} | 匹配前面的字符至少 n 次 |
{n,m} | 匹配前面的字符至少 n 次,最多 m 次 |
[…] | 匹配字符集中的任意一个字符 |
[^…] | 匹配除字符集中的任意一个字符外的任意一个字符 |
(x|y) | 匹配 x 或 y |
\ | 转义特殊字符 |
\A | 匹配字符串的开始,和 ^ 功能相同 |
\Z | 匹配字符串的结束,和 $ 功能相同 |
\b | 匹配单词的边界 |
\B | 匹配非单词的边界 |
(?P<name>...) |
匹配 … 并且将结果命名为 name,可以使用 group(name) 获取结果 |
在 Python 中,我们可以通过构造正则表达式对象,然后调用其方法来进行正则表达式的匹配。常用的方法包括:
方法 | 描述 |
---|---|
compile(pattern,flags) | 编译正则表达式,生成正则表达式对象,可以调用其方法进行匹配 |
match(pattern,string) | 从字符串的起始位置开始匹配,返回匹配的结果对象 |
search(pattern,string) | 在字符串中搜索匹配,返回第一个匹配的结果对象 |
findall(pattern,string) | 查找字符串中所有匹配的字符串,返回一个列表 |
sub(pattern,repl,string) | 在字符串中替换匹配的字符串 |
银行账号的验证规则
在进行银行账号的验证时,我们需要了解其特定的位数和格式规则。下面是一些常用的银行账号验证规则:
银行名称 | 格式 | 位数 |
---|---|---|
中国工商银行 | 常规卡号为19位,以62开头 | 19位 |
中国建设银行 | 常规卡号为16位,以62开头 | 16位 |
中国农业银行 | 常规卡号为19位,以62开头 | 19位 |
中国银行 | 常规卡号为19位,以62开头 | 19位 |
交通银行 | 常规卡号为19位,以62开头 | 19位 |
中信银行 | 常规卡号为16位或19位,15开头 | 16位或19位 |
招商银行 | 常规卡号为16或19位 | 16或19位 |
广发银行 | 常规卡号为16或19位 | 16或19位 |
中国民生银行 | 常规卡号为19位,以62开头 | 19位 |
中国光大银行 | 常规卡号为16位或19位 | 16或19位 |
华夏银行 | 常规卡号为16位或19位,以62开头 | 16或19位 |
浦发银行 | 常规卡号为19位,以62开头 | 19位 |
兴业银行 | 常规卡号为16或19位 | 16或19位 |
中国邮政储蓄银行 | 普通活期存折8位,以10,20,30,62开头;储蓄卡号16位,以62开头 | 8位或16位 |
中国人民银行财务司银行卡 | 以62开头,10位或19位 | 10位或19位 |
Python 中的银行账号验证代码
下面是在 Python 中实现银行账号验证的示例代码:
import re
def validate_bank_account(bank_name, account_number):
pattern_dict = {
"中国工商银行": "^62\d{17}",
"中国建设银行": "^62\d{13}",
"中国农业银行": "^62\d{17}",
"中国银行": "^62\d{17}",
"交通银行": "^62\d{17}",
"中信银行": "^(15\d{14}|62\d{16,17})",
"招商银行": "^(62\d{15}|\d{18})",
"广发银行": "^(62\d{15}|\d{18})",
"中国民生银行": "^62\d{17}",
"中国光大银行": "^(62\d{15}|\d{18})",
"华夏银行": "^(62\d{15}|\d{18})",
"浦发银行": "^62\d{17}",
"兴业银行": "^(62\d{15}|\d{18})",
"中国邮政储蓄银行": "^(10|20|30|62)\d{6}|^\d{16}",
"中国人民银行财务司银行卡": "^62\d{8}|^62\d{17}$"
}
pattern = pattern_dict.get(bank_name, None)
if pattern:
return bool(re.match(pattern, account_number))
else:
return False
在上面的代码中,我们首先定义了一个 validate_bank_account 函数,它接受一个银行名称和账号作为参数。然后,我们使用字典来存储每个银行的正则表达式模式,并根据银行名称获取对应的模式。最后,我们通过调用 re.match 方法来进行银行账号的匹配,并返回匹配结果的布尔值。
调用示例
下面是使用上述函数实现银行账号验证的示例代码:
# 定义一个银行账号验证测试函数
def test_validate_bank_account():
test_data = [
("中国工商银行", "6200000000000000000", True), # 正常 19 位卡号
("中国建设银行", "6235000000000000", True), # 正常 16 位卡号
("中国农业银行", "6228480000000000000", True), # 正常 19 位卡号
("中国银行", "6217000000000000000", True), # 正常 19 位卡号
("交通银行", "6222600000000000000", True), # 正常 19 位卡号
("中信银行", "6221550000000000000", True), # 正常 16 位卡号
("中信银行", "6200000000000000000", True), # 正常 19 位卡号
("招商银行", "622580000000000000", True), # 正常 16 位卡号
("招商银行", "6200000000000000000", True), # 正常 19 位卡号
("广发银行", "6230580000000000000", True), # 正常 16 位卡号
("广发银行", "6200000000000000000", True), # 正常 19 位卡号
("中国民生银行", "6214990000000000000", True), # 正常 19 位卡号
("中国光大银行", "6226270000000000000", True), # 正常 16 位卡号
("中国光大银行", "6200000000000000000", True), # 正常 19 位卡号
("华夏银行", "6226360000000000000", True), # 正常 16 位卡号
("华夏银行", "6200000000000000000", True), # 正常 19 位卡号
("浦发银行", "6225210000000000000", True), # 正常 19 位卡号
("兴业银行", "6229090000000000000", True), # 正常 16 位卡号
("兴业银行", "6200000000000000000", True), # 正常 19 位卡号
("中国邮政储蓄银行", "1030000000000000", True), # 正常 8 位卡号
("中国邮政储蓄银行", "6221880000000000000", True), # 正常 16 位卡号
("中国人民银行财务司银行卡", "62104502000139129", True), # 正常 19 位卡号
("中国人民银行财务司银行卡", "6230580000032262396", True), # 正常 19 位卡号
("未知银行", "1234567890123456", False), # 错误的卡号
]
for bank_name, account_number, is_valid in test_data:
assert validate_bank_account(bank_name, account_number) == is_valid
# 调用测试函数
test_validate_bank_account()
在上面的测试函数中,我们定义了一个 test_validate_bank_account 函数,用来测试 validate_bank_account 函数的正确性。我们将不同的银行名称和账号组成的元组构成一个测试数据集合,并使用 assert 语句来检查 validate_bank_account 函数的返回值是否正确。
结论
通过上述的 Python 示例代码,我们可以看到,使用正则表达式在 Python 中验证银行账号可以方便快捷地完成。因此,在进行银行账号的验证时,我们可以利用 Python 中的 re 模块和正则表达式,来实现严格的验证,并避免错误和安全隐患的出现。