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

Python循环批量搜索DataFrame多列关键词失效问题求助

问题:批量处理正则匹配时结果全为0的原因及解决办法

原代码可正确检测每行是否同时包含单词“pool”以及“slide”或“waterslide”:

AR11_regex = r"""
(?=.*(?:slide|waterslide)).*pool
"""
f = lambda x: x.str.findall(AR11_regex, flags= re.VERBOSE|re.IGNORECASE)
d['AR'][AR11] = d['AR'].astype(str).apply(f).any(1).astype(int)

但通过for循环批量处理多个正则模式(如AR11、AR12、AR21)时,生成的新列值全为0,循环代码如下:

for i in AR_list:
    print(i)
    pat = i+"_regex"
    print(pat)
    f = lambda x: x.str.findall(i+"_regex", flags= re.VERBOSE|re.IGNORECASE)
    d['AR'][str(i)] = d['AR'].astype(str).apply(f).any(1).astype(int)

失效原因

  • 字符串拼接错误:循环中i+"_regex"是把变量i的字符串值和"_regex"拼接成了普通字符串(比如i为"AR11"时,得到字符串"AR11_regex"),而非引用你之前定义的正则变量AR11_regex。正则引擎会把这个字符串当作匹配目标,自然找不到任何匹配,结果全为0。
  • 代码中pat = i+"_regex"定义后未使用,属于冗余代码。

修正方案

要通过变量名获取对应的正则表达式,不能直接拼字符串。可以用globals()(全局作用域)或locals()(局部作用域)函数根据变量名字符串获取变量值,同时注意lambda的变量绑定问题:

import re

for i in AR_list:
    # 获取对应名称的正则变量
    regex_pattern = globals()[i + "_regex"]
    # 将正则作为默认参数传入lambda,避免循环延迟绑定问题
    f = lambda x, pattern=regex_pattern: x.str.findall(pattern, flags=re.VERBOSE|re.IGNORECASE)
    d['AR'][str(i)] = d['AR'].astype(str).apply(f).any(1).astype(int)

关键注意点

  • 若正则变量定义在局部作用域,将globals()替换为locals()。
  • 必须把pattern作为lambda的默认参数传入,否则所有lambda会共享循环最后一次的regex_pattern值,导致匹配结果错误。

内容的提问来源于stack exchange,提问作者KumaKuma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:33:55