Android平台:正则表达式筛选信用卡/借记卡交易短信
如何精准筛选信用卡/借记卡交易短信
兄弟,我太懂你这个痛点了——只靠卡号正则确实会把一堆银行推广短信也误捞进来,毕竟现在很多推广短信也会带上脱敏的卡号来蹭眼熟。得从交易短信的核心特征入手,把正则和关键词过滤结合起来,给你几个实用的思路:
1. 锁定交易核心关键词
交易短信必然会包含和资金变动相关的动作词,比如「消费」「支出」「转账」「还款」「入账」「扣款」「交易成功」「支付」这些。你可以把这些关键词和卡号正则结合,先判断短信有没有这些词,再匹配卡号,从根源上排除推广短信。
优化后的组合正则可以这么写:
(消费|支出|转账|还款|入账|扣款|交易成功|支付).*([0-9]{4}[Xx*]{4,8}[0-9]{4})
这里把卡号正则也优化了——脱敏银行卡号一般是前4位数字,中间4-8位打码(*或x),最后4位数字,用[0-9]{4}[Xx*]{4,8}[0-9]{4}能精准匹配这种格式,避免误抓其他数字串。
2. 叠加金额特征过滤
交易短信肯定会有金额信息,格式无非是「¥XX.XX」「金额:XX.XX」或者「$XX.XX」这类。把金额正则也加进去,三重过滤(交易关键词+卡号+金额),精准度会大幅提升。
金额的正则可以这么写:
¥\d+(\.\d{1,2})?|金额:\d+(\.\d{1,2})?
3. 反向排除推广关键词
反过来想,推广短信常带「办理」「升级」「额度提升」「优惠」「活动」「免费」这些词,你可以在筛选逻辑里加一步:如果短信包含这些词,直接跳过,不用再走后续匹配。
举个实际代码例子(Python)
下面是一个完整的筛选逻辑示例,把上面的思路整合起来:
import re # 预编译正则,提升效率 transaction_keywords = re.compile(r'消费|支出|转账|还款|入账|扣款|交易成功|支付') exclude_keywords = re.compile(r'办理|升级|额度提升|优惠|活动|免费') card_pattern = re.compile(r'[0-9]{4}[Xx*]{4,8}[0-9]{4}') amount_pattern = re.compile(r'¥\d+(\.\d{1,2})?|金额:\d+(\.\d{1,2})?') # 假设这是你的短信列表 sms_list = [ "您尾号1234的储蓄卡账户10月5日10:00消费¥199.00,余额5000.00", "【XX银行】您的信用卡尾号5678可提升额度至5万,点击办理", "您尾号9012的信用卡于10月5日14:30还款¥2000.00,已到账", "【XX银行】双11信用卡满减活动,尾号3456卡可享满100减20" ] # 筛选结果 transaction_sms = [] for sms in sms_list: # 先排除推广短信 if exclude_keywords.search(sms): continue # 同时满足交易关键词、卡号、金额三个条件才保留 if all([ transaction_keywords.search(sms), card_pattern.search(sms), amount_pattern.search(sms) ]): transaction_sms.append(sms) print(transaction_sms)
运行后只会输出真正的交易短信,推广短信会被直接排除。
内容的提问来源于stack exchange,提问作者Basha A
相关产品推荐
相关产品推荐

