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
相关产品推荐
相关产品推荐

