正则表达式优化邮件优惠券代码提取逻辑适配多格式
提取营销邮件中的优惠券代码问题
问题背景
我需要解析邮箱里的营销邮件,从中提取优惠券代码,但当前写的逻辑只能适配单一格式。现有代码如下:
def extract_promo_code(body): # Use regular expressions to find promo code promo_code_pattern = r'(?i)(?:Enter\s+Code|Enter\s+promo)(?:[\s\n]*)([A-Z0-9]+)' match = re.search(promo_code_pattern, body) if match: promo_code = match.group(1) # Remove any non-alphanumeric characters from the promo code promo_code = re.sub(r'[^A-Z0-9]', '', promo_code) return promo_code else: return None
待处理的邮件样本:
- 样本1:
结账时输入代码.*
优惠有效期至2023年10月6日美国中部时间23:59
MKEA15EMYZGP8W
- 样本2:
输入代码JSB20GR335F4
有效期至2023年9月21日美国中部时间23:59.*
需求是:匹配“Enter Code”“enter promo”以及中文“输入代码”之后出现的首个大写字母+数字组合的优惠券代码,允许触发文本和代码之间有换行、空格甚至其他文本。当前代码能处理样本2,但识别不了样本1的代码。
解决方案
原代码的问题在于两个点:一是没覆盖中文触发词“输入代码”,二是仅用[\s\n]*只能匹配连续空白,无法跳过触发词和代码之间的其他文本内容。修改后的代码如下:
import re def extract_promo_code(body): # 匹配中英文触发词,跳过中间任意内容,提取首个符合格式的优惠券代码 promo_code_pattern = r'(?i)(?:Enter\s+Code|Enter\s+promo|输入代码).*?([A-Z0-9]+)' match = re.search(promo_code_pattern, body, re.DOTALL) if match: promo_code = match.group(1) promo_code = re.sub(r'[^A-Z0-9]', '', promo_code) return promo_code else: return None
修改说明
- 正则表达式中新增
|输入代码,覆盖中文触发场景 - 使用
.*?非贪婪匹配,跳过触发词和优惠券之间的所有内容(包括换行和其他文本) - 添加
re.DOTALL参数,让正则中的.可以匹配换行符,支持跨多行匹配
测试效果
- 针对样本1,能正确提取出
MKEA15EMYZGP8W - 针对样本2,依然可以正常提取
JSB20GR335F4
内容的提问来源于stack exchange,提问作者Raafeh Sajjad
相关产品推荐
相关产品推荐

