欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python使用正则筛选信用卡

程序员文章站 2023-11-12 22:42:16
本文实例为大家分享了python使用正则筛选信用卡的具体代码,供大家参考,具体内容如下 本文来源于两个简单的题目: 1.判断一对单词是否是" anagrams " 2...

本文实例为大家分享了python使用正则筛选信用卡的具体代码,供大家参考,具体内容如下

本文来源于两个简单的题目:

1.判断一对单词是否是" anagrams "
2.判断信用卡是否合理

判断 anagramsstrong>

anagrams 的百度翻译:由颠倒字母顺序而构成的字(短语)

而题目给出例子:

[ dog , odg ]
[ dog , dog ]
[ dog , god ]
[ dog , gdo ]

均为 anagrams 。

那思路就简单了,直接拆分字母,排序,比较就 ok 。

判断信用卡

题目给出的要求如下:

the criteria are:
• it must start with a 4,5 or 6
• it must be exactly 16 digits
• it must be numbers only
• it can have a digits in groups of 4, separated by one hyphen “-“
• it should not contain any other characters.
• it must not have any 4 repeated digits.

样例输出如下:

378282246310005 invalid
30569309025904 invalid
6011111111111117 invalid
5123-2332-3232-3213 valid

py文件

两个题目合并在一个 py 文件中。 
而入参数分别是两个文件的名字,一个是 anagram.txt ,另一个是 credit_cards.txt ,他们分别长这样:

python使用正则筛选信用卡

python使用正则筛选信用卡

最后的程序长这样:

#! /usr/bin/python3
import re
###############################
##you need to implet the following methods:
##
##question 1
##anagram_validator() 
##
##question 2
##credit_card_validator() 

################################

###################################################
# question 1: check for anagrams:#
###################################################

def get_list(src_str):
 sub_list=[]
 word_tmp=''
 for word in src_str:
 if word != ',':
 word_tmp = word_tmp+word
 else: 
 sub_list.append(word_tmp)
 word_tmp = ''
 return sub_list

def read_anagram(file_name):
 '''
 input: a file name
 return: a nested list of two words list
 example : [[word1,word2],[word3,word4]...etc]
 '''
 with open(file_name,encoding = 'utf-8') as f:
 return_list =[] 
 file_conment = f.read()

 file_conment_new = re.sub(r'\n',',',file_conment)
 file_conment_new = file_conment_new+','
 subs_list = get_list(file_conment_new)
 i=0
 while i < (len(subs_list)-1):
 return_list.append([subs_list[i],subs_list[i+1]])
 i=i+2 
 return return_list



def anagram_validator(anagram):
 '''
 input is the output from "read_anagram()".
 return: list of "anagrams" or "not anagrams" values for each two words
 example input (dog,gdo),(try,elm) then output would be ["anagrams","not anagrams"] with sequence of the input
 '''
 result_list=[]
 for i in range(len(anagram)):
 word_font = ''.join((lambda x:(x.sort(),x)[1])(list(anagram[i][0])))
 word_back = ''.join((lambda x:(x.sort(),x)[1])(list(anagram[i][1])))
 if word_font == word_back:
 result_list.append('anagrams')
 else:
 result_list.append('not anagrams')

 return result_list

############################################
# question 2: validate credit cards #
############################################
def read_credit_cards(file_name):
 '''
 input: a file name
 return tuple of numbers
 '''
 with open(file_name,encoding='utf-8') as f:
 card_conment = f.read()

 card_conment = re.sub(r'\[','',card_conment)
 card_conment = re.sub(r'\]','',card_conment)
 card_conment = card_conment+','
 card_list = get_list(card_conment)
 return tuple(card_list)


def credit_card_validator(numbers):
 '''
 input: tuple of numbers
 return:dictionary of credit card numbers where key is the number and value if valid or invalid
 '''
 validator_list=[]
 credit_dict={}
 for i in range(len(numbers)):
 validator_list.append(numbers[i])
 
 for i in range(len(numbers)):
 ch_num = 0
 repeat_flag = 0
 for ch in validator_list[i]:
 if ord("a")<=ord(ch)<=ord("z"):
 ch_num+=1
 break

 tmp_list = []
 tmp_list = (re.sub(r"[^\d]", "", validator_list[i]))
 for index in range(len(tmp_list)-4):
 if(tmp_list[index] == tmp_list[index+1] and
 tmp_list[index] == tmp_list[index+2] and
 tmp_list[index] == tmp_list[index+3] ):
 repeat_flag = 1
 break;

 if(validator_list[i][0] != '4' and
 validator_list[i][0] != '5' and
 validator_list[i][0] != '6' ):
 credit_dict[validator_list[i]]='invalid'
 elif( len(re.sub(r"\d", "", validator_list[i])) != 16 ):
 credit_dict[validator_list[i]]='invalid'
 elif(ch_num > 0):
 credit_dict[validator_list[i]]='invalid'
 elif( 
 (re.search(r"-",validator_list[i])) and 
  ( validator_list[i][4] != '-' or 
  validator_list[i][9] != '-'or
  validator_list[i][14] != '-'
  )
 ):
 credit_dict[validator_list[i]]='invalid'
 elif(re.search(r"[^-\d]",validator_list[i])):
 credit_dict[validator_list[i]]='invalid'
 elif(repeat_flag == 1 ):
 credit_dict[validator_list[i]]='invalid'
 else :
 credit_dict[validator_list[i]]='valid'
 space_str = '' 

 return credit_dict


def print_credit_card_summary(dict_o):
 '''
 input: dict
 return:
 printing summary of validation result - space between credit card and status is 40 width
 example:
 378282246310005 invalid
 30569309025904 invalid
 ''' 
 space_str = '' 
 for key in dict_o:
 new_str = key + dict_o[key]
 if(dict_o[key] == "valid"):
 new_str_tmp = new_str[:-5]
 space_lenth = 46-len(new_str)
 for x in range(space_lenth):
 space_str +=' '
 print(new_str_tmp + space_str + 'valid')
 space_str=''
 else :
 new_str_tmp = new_str[:-7]
 space_lenth = 48-len(new_str)
 for x in range(space_lenth):
 space_str +=' '
 print(new_str_tmp + space_str + 'invalid')
 space_str='' 



####### the code below is for testing###################
############### do not change #########################


import sys

if __name__ == '__main__':
 # take care of the console inputs
 if len(sys.argv) <= 1:
 sys.argv = ['', "anagram.txt", "credit_cards.txt"]
 stars = '*' * 40
 print(stars)
 print("testing question 1 --- anagrams?")
 print(stars)

 # testing reading_anagrams
 try:
 anagram = read_anagram(sys.argv[1])
 if not anagram:
 print("read_anagram() returns none.")
 else:
 print("anagram: ", anagram)
 print()
 except exception as e:
 print("error (readnumbers()): ", e)

 # testing anagram_validator
 anagrams = 0
 nanagrams = 0
 try:
 if not anagram: # question 1 has not been implemented
 print("anagram_validator() skipped....")
 else:
 result = anagram_validator(anagram)
 if result == none:
 print("anagram_validator() returns none.")
 else:
 for i in result:
  if i == "anagrams":
  anagrams += 1
  elif i == "not anagrams":
  nanagrams += 1
 print("number of valid anagrams is {} and not anagrams is {}.".format(anagrams, nanagrams))

 except exception as e:
 print("error (anagram_validator()):", e)

 # testing question 2
 
 print("\n\n" + stars)
 print("testing question 2 --- credit card validator")
 print(stars)

 # testing reading_credit_cards
 try:
 tup = read_credit_cards(sys.argv[2])
 if not tup:
 print("read_credit_cards() returns none.")
 else:
 print("the tuple of credit_cards: {}".format(tup))
 except exception as e:
 print("error (read_credit_cards()):", e)

 # testing credit_card_validator
 vcc = 0
 ivcc = 0
 try:
 if not tup: # readin_question 2 has not been implemented
 print("credit_card_validator() skipped...")
 else:
 cc_dict = credit_card_validator(tup)
 tmp_cc_dict = cc_dict
 if not cc_dict:
 print("credit_card_validator() returns none.")
 else:
 for items in cc_dict.keys():
  if cc_dict[items] == "valid":
  vcc += 1
  elif cc_dict[items] == "invalid":
  ivcc += 1
 print("number of valid credit cards is {} and invalid {}.".format(vcc, ivcc))
 except exception as e:
 print("error (credit_card_validator()):", e)

 # testing question 2
 print("\n\n" + stars)
 print("testing question 2b --- print credit card summary")
 print(stars)
 # testing print_credit_card_summary
 try:
 if not tmp_cc_dict: # dict credit card output has not been implemented
 print("print_credit_card_summary() skipped...")
 else:
 import io # do not delete this line
 from contextlib import redirect_stdout # do not delete this line

 f = io.stringio()
 with redirect_stdout(f):
 print_credit_card_summary(tmp_cc_dict)
 out = f.getvalue()
 if not out:
 print("print_credit_card_summary() returns none.")
 else:
 count44 = 0
 count46 = 0
 for line in out.splitlines():
  if len(line) - len(line.split()) == 44:
  count44 += 1
  elif len(line) - len(line.split()) == 46:
  count46 += 1
 if count44 == vcc and count46 == ivcc:
  print("your format looks good")
 else:
  print("you might have some issues in your summary format")


 except exception as e:
 print("error (print_credit_card_summary()):", e)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。