2017-11-27 16 views
0

テキスト文書ですべてのクレジットカード番号を見つけることができましたが、フィルタをかけて '4'または '5'で始まるカードのみを印刷します。私は無用に^記法を試しました。どこが間違っていますか?Python正規表現フィルタ初期番号

#credit cards - visa starts with '4' and mastercard starts with '5' 
re.findall(r'(?:[0-9]{4}-){3}[0-9]{4}|[0-9]{16}|(?:[0-9]{4}\s?){3}[0-9]{4}|[0-9]{16}', reg) 

#reg contains the following cc numbers 
['4916 0636 4700 5548', 
'4556-0775-2249-5041', 
'5119 0966 3584 2334', 
'5108-5708-8343-5937', 
'1234 2345 3456 4567', 
'2132-3523-3211-3356', 
'5118-3323-1315-9900'] 
+0

どのように単に 'x.startswith( '4')またはx.startswith(5 '')'を使用してはどうですか? – mkrieger1

+1

@ mkrieger1 'startswith()'は文字列のタプルを受け入れます。 'x.startswith(( '' 4 '、' 5 '))'。 – alecxe

答えて

2

あなたはこれを試すことができます。

import re 
cards = ['4916 0636 4700 5548', 
'4556-0775-2249-5041', 
'5119 0966 3584 2334', 
'5108-5708-8343-5937', 
'1234 2345 3456 4567', 
'2132-3523-3211-3356', 
'5118-3323-1315-9900'] 
new_cards = [card for card in cards if re.findall('^5|^4', card)] 

出力:

['4916 0636 4700 5548', '4556-0775-2249-5041', '5119 0966 3584 2334', '5108-5708-8343-5937', '5118-3323-1315-9900'] 
1

非正規表現ソリューションstr.startswith()を使用して、文字列の可能な始まりのタプルを提供することを含むことがあります。

str.startswith(prefix[, start[, end]])

戻り値True文字列が接頭辞で始まる場合は、それ以外の場合はFalseを返します。 prefixは、検索する接頭辞のタプルでもあります。

In [1]: cards = ['4916 0636 4700 5548', 
    ...: '4556-0775-2249-5041', 
    ...: '5119 0966 3584 2334', 
    ...: '5108-5708-8343-5937', 
    ...: '1234 2345 3456 4567', 
    ...: '2132-3523-3211-3356', 
    ...: '5118-3323-1315-9900'] 

In [2]: [card for card in cards if card.startswith(('4', '5'))] 
Out[2]: 
['4916 0636 4700 5548', 
'4556-0775-2249-5041', 
'5119 0966 3584 2334', 
'5108-5708-8343-5937', 
'5118-3323-1315-9900']