如何修改Python实现的类SAS INDEXW函数,解决返回结果全为False的问题
Python实现SAS INDEXW函数问题修复
问题原因
你编写的初始代码未得到预期结果,核心问题有两点:
- 逻辑设计错误:将source拆分为单个单词后与完整excerpt匹配,无法支持excerpt是多个连续单词的场景
- 匹配方向不符合调用需求:原逻辑判断
excerpt是否为source的单个子词,而你的调用逻辑需要判断第一个入参是否作为完整连续词序列存在于第二个入参中
修复后的代码
import re def INDEXW(source, excerpt): # 标准化字符串:去除首尾空格,将连续空格替换为单个空格 def normalize_str(s): return re.sub(r'\s+', ' ', str(s).strip()) norm_source = normalize_str(source) norm_excerpt = normalize_str(excerpt) # 前后拼接空格避免词的部分匹配 return f' {norm_source} ' in f' {norm_excerpt} ' # 调用逻辑保持不变 Sample["RESULT1"] = Sample[["Col1","Col2"]].apply(lambda x: INDEXW(*x), axis=1) Sample["RESULT2"] = Sample[["Col2","Col1"]].apply(lambda x: INDEXW(*x), axis=1)
效果验证
运行上述代码后得到的结果和预期完全一致:
| Col1 | Col2 | RESULT1 | RESULT2 |
|---|---|---|---|
| FIG AVE | FIG AVE | True | True |
| LAKE HATCHINEHA RD | HATCHINEHA RD | False | True |
| MERLE CIR | MERLE CIR | True | True |
| ARCH ST | W ARCH ST | True | False |
| WESTVIEW DR | CLAYMORE CT | False | False |
补充(对齐SAS官方定义版本)
如果你需要严格对齐SAS官方的INDEXW函数定义(即判断excerpt作为完整词序列是否存在于source中,找到返回首次出现位置,否则返回0),可以使用以下版本:
import re def SAS_INDEXW(source, excerpt, delimiters=r'\s'): source = str(source).strip() excerpt = str(excerpt).strip() if not excerpt: return 0 pattern = rf'(?:^|{delimiters}){re.escape(excerpt)}(?:{delimiters}|$)' match = re.search(pattern, source) return match.start() + 1 if match else 0 # 调用时判断返回值是否大于0即可得到布尔结果
内容的提问来源于stack exchange,提问作者Peter Chen
相关产品推荐
相关产品推荐

