我随身携带一些信用卡号码,希望通过以下规则验证它们。
►必须只包含数字(0-9)
► 它可以有4个一组的数字,由一个连字符“-”分隔
► 它不能有4个或更多连续重复的数字
►它可以包含没有任何空格的精确数字
输入:
>
61234-567-8912-3456
4123356789123456
5133-3367-8912-3456
输出:
>
有效的
无效(因为卡号没有分成4个相等的组)
有效
无效(连续33位重复4次)
我在这里试过,它的工作,只有当我包括连字符在最后。有人能给我一个正确的reg ex。
编辑:
正则表达式代码:([0-9]{4}-{4}
要匹配的输入6244-5567-8912-3458
直到我把连字符放在末尾才匹配。
编辑
import re
import itertools
text="5133-3367-8912-3456"
print(len(text))
l=[(k, sum(1 for i in g)) for k,g in itertools.groupby(text)] #To calculate frequency of characters and later we can filter it with the condition v<=3 for checking the concurrency condition
if re.search(r'^[456]+',text) and len(text)==16 and re.search(r'[\d]',text) and all(v<=3 for k,v in l) and bool(re.search(r'\s',text)) is False and bool(re.search(r'[a-z]',text)) is False or( bool(re.search(r'-',text))is True and len(text)==19) :
print("it passed")
else :
print("False")
除非您真的想/需要使用正则表达式,否则可以通过以下简单的python代码来解决此任务:
import itertools
card = "5133-3467-8912-.456"
# Check if hyphens are ok
if (len(card.split('-')) == 1 and len(card) == 16) or (len(card.split('-')) == 4 and all(len(i) == 4 for i in card.split("-"))):
# Remove all hyphens (if any)
card = card.replace("-", "")
try:
# Check if numbers only
int(card)
# Check if more than 3 repeated digits
if max(len(list(g)) for _, g in itertools.groupby(card)) > 3:
print("Failed: 4+ repeated digits")
else:
print("Passed")
except ValueError as e:
print("Failed: non-digit characters")
else:
print("Failed: bad hyphens or length")
你的正则表达式几乎是正确的。它要求四组以破折号结尾的数字。您需要的是三个以破折号结尾的组,然后是一个以非破折号结尾的组,或者一个没有破折号的blob:
(?:[0-9]{4}-){3}[0-9]{4}|[0-9]{16}
[链接]
因为你不需要捕捉内容,所以我将该组设置为非捕捉。您也可以使用\d
而不是[0-9]
:
(?:\d{4}-?){3}\d{4}
[链接]
在单独的步骤中,验证连续数字可能更容易。正则表达式匹配通过后,删除所有破折号:
num = num.replace('-', '')
现在使用itertools检查重复的数字。groupby,类似于这个问题/答案:
from itertools import groupby
if max(len(list(g)) for _, g in groupby(num)) >= 4:
print('Invalid: too many repeated digits')
完整代码
from itertools import groupby
import re
pattern = re.compile(r'(?:\d{4}-){3}\d{4}|\d{16}')
def count_consecutive(num):
return max(len(list(g)) for _, g in groupby(num)
num = '6244-5567-8912-3458'
if not pattern.fullmatch(num) or count_consecutive(num.replace('-', '')) >= 4:
print('Failed')
else:
print('Success')
我的解决方案有一个两步逻辑。你不能一次完成的原因与python re的局限性有关。我们将把它保存到以后。如果你感兴趣,看看附录1。
2步:第一步检查“-”是否在正确的位置,第二步检查是否有4个连续相等的数字。
我将从第二步开始,这是最消耗内存的一步:一个检查是否没有连续4个数字的正则表达式。下面的正则表达式可以:
((\d)(?!\2{3})){16}
说明:
( # group 1 start
(\d) # group 2: match a digit
(?!\2{3}) # negative lookahead: not 3 times group 2
){16} # repeat that 16 times.
看看例子1
第一步是匹配由4个数字组成的组,最终以“-”分隔(参见示例2)。这里要解决的问题是,如果第一组和第二组数字以“-”分隔,那么所有组都需要以“-”分隔。我们通过在下一个正则表达式中使用对第2组的反向引用来实现这一点。
(\d{4})(-?)(\d{4})(\2\d{4}){2}
说明:
(\d{4}) # starting 4 digits
(-?) # group 2 contains a '-' or not
(\d{4}) # 2nd group of 4 digits
(\2\d{4}){2} # last 2 groups, starting with a backreference
# to group 2 ( a '-' or not)
示例程序:
import re
pattern1 = r"(\d{4})(-?)(\d{4})(\2\d{4}){2}"
pattern2 = r"((\d)(?!\2{3})){16}"
tests = ["5123-4567-8912-3456"]
for elt in tests:
if re.match( pattern1, elt):
print "example has dashes in correct place"
elt = elt.replace("-", "")
if re.match(pattern2, elt):
print "...and has the right numbers."
附录:现在是沙漠。我已经把一个正则表达式放在一起,一次就完成了。让我们根据每个数字在一组中的位置来考虑每个数字需要什么:
因此,对于示例1中使用的前瞻,我们需要为每个数字显示所有后续操作的可能性。让我们来看一组4位数字的模式:
(
(\d) # the digit at hand
(?! # negative lookahead
\2{3} # digit, digit, digit
|\2{2}-\2 # OR digit, digit, dash, digit
|\2-\2{2} # OR digit, dash, digit, digit
|-\2{3} # OR dash, digit, digit, digit
)
){4} # 4 times, for each digit in a group of 4
当然,我们想把这个数字扩大到16位。我们需要定义是否可以在数字前加“-”。一个简单的-
不行,因为信用卡不是以破折号开头的。让我们使用交替:
(? # if
(?<=\d{4}) # lookbehind: there are 4 preceding digits
-? # then: '-' or not
| # else: nothing
)
综合起来,这让我们想到:
\b((?(?<=\d{4})-?|)(\d)(?!\2{3}|\2{2}-\2|\2-\2{2}|-\2{3})){16}\b
请看示例3。我们需要两边的\b,因为我们想确保无论何时匹配成功,它都与
完成
字符串匹配。
让我们公平地说:人们怀疑这是否是一条道路。从好的方面来看,我们现在有一个合理的理由可以分两步来做:python的标准re不支持条件句等等。你可以通过使用替代品来解决这个问题。或切换编程语言。;-)
附录2:人们问我例3中的
16
来自哪里。完整的字符串可以是19个字符,这不是真的吗?原因是每当内部html" target="_blank">正则表达式(组1)匹配一次时,它就会与[0-9]
或-[0-9]
匹配。那场比赛必须成功整整16次。
说明 此协议用于用微信卡代替实体卡刷卡时,验证发送给客户微信的验证码,需要先调用协议5.4发送验证码。 请求地址 http://api.dc78.cn/Api/mb_checkvcode 请求方式 GET 请求参数 参数 参数名称 必填 描述 范例 id 微信卡id 是 code 验证码 是 amt 交易金额 否 传入金额可以验证与发送验证码时的金额是否匹配 pwd 通卡密码 是 当会员卡为通卡时
此协议用于用微信卡代替实体卡刷卡时,验证发送给客户微信的验证码,需要先调用协议5.4发送验证码。 请求参数说明 参数 描述 必填 示例值 类型 最大长度 action 接口参数组 是 object └action 需要调用的接口名称 是 mb_checkvcode string get GET参数组,本组参数需要参与签名 是 object └mbno 会员卡号 否 15696132602 numb
我正在恩智浦J3D081卡上编写Java卡3.0.2应用程序。我让它使用ALG_ECDSA_SHA_256对签名进行签名和验证。我的测试应用程序已经把钥匙写到卡上了。如果我对32字节的数据进行签名并将签名传回卡,验证码将成功地验证签名。如果我用私钥在Bouncy Castle中签名32个字节,并传递到卡上的验证,它就成功地验证了签名。bouncy castle验证代码成功验证从bouncy cas
我需要为我的输入自动创建每个4个数字的空间。这是我的代码: 在这里,我只能键入数字。我需要以这种格式输入卡号1111 2222 3333 4444。自动创建空间,每个4个数字
本文向大家介绍PHP验证信用卡卡号是否正确函数,包括了PHP验证信用卡卡号是否正确函数的使用技巧和注意事项,需要的朋友参考一下 可以使用以下PHP函数,验证一个卡号是否是信用卡:
问题内容: 我如何验证信用卡。我需要做检查。黑莓中有API可以做到吗? 问题答案: 您可以使用以下方法来验证信用卡号