Python实现基于字典正则规则新增验证结果列
解决方案
核心思路
由于每行的校验规则依赖Type列的后缀(对应正则字典的键),属于动态逐行匹配场景,numpy.where()更适合固定条件的向量化判断,这里用pandas.apply()逐行处理更直接。
完整代码示例
import pandas as pd import re # 1. 示例数据(替换为你的实际数据) df = pd.DataFrame({ 'Type': ['A_EMAIL', 'B_PHONE', 'A_EMAIL', 'C_ID', 'D_UNKNOWN'], 'Value': ['test@example.com', '1234567890', 'invalid-email', '12345', 'random_text'] }) # 2. 正则规则字典(键对应Type的后缀) regex_dict = { 'EMAIL': r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$', 'PHONE': r'^\d{10}$', 'ID': r'^\d{5}$' } # 3. 定义校验函数 def validate_value(row): # 提取Type的后缀(按下划线分割取最后一段) type_suffix = row['Type'].split('_')[-1] # 获取对应正则,无匹配则返回False pattern = regex_dict.get(type_suffix) if not pattern: return False # 用fullmatch严格匹配正则(避免部分匹配) return bool(re.fullmatch(pattern, row['Value'])) # 4. 生成Result列 df['Result'] = df.apply(validate_value, axis=1) # 查看结果 print(df)
运行结果
Type Value Result 0 A_EMAIL test@example.com True 1 B_PHONE 1234567890 True 2 A_EMAIL invalid-email False 3 C_ID 12345 True 4 D_UNKNOWN random_text False
可选优化(向量化思路)
若追求更高效率,可先提取后缀并映射正则,再批量校验:
# 提取后缀 df['Suffix'] = df['Type'].str.split('_').str[-1] # 映射正则规则 df['Pattern'] = df['Suffix'].map(regex_dict) # 批量校验 df['Result'] = df.apply( lambda x: bool(re.fullmatch(x['Pattern'], x['Value'])) if x['Pattern'] else False, axis=1 ) # 清理中间列 df = df.drop(['Suffix', 'Pattern'], axis=1)
关键说明
- 使用
re.fullmatch()而非re.match()/re.search(),确保整个Value字符串完全符合正则规则,避免部分匹配的误判。 - 若
Type的后缀不在正则字典中,默认返回False,可根据需求调整为None或其他值。
内容的提问来源于stack exchange,提问作者Joash Goh
相关产品推荐
相关产品推荐

