You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:38:26