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

如何修改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)

效果验证

运行上述代码后得到的结果和预期完全一致:

Col1Col2RESULT1RESULT2
FIG AVEFIG AVETrueTrue
LAKE HATCHINEHA RDHATCHINEHA RDFalseTrue
MERLE CIRMERLE CIRTrueTrue
ARCH STW ARCH STTrueFalse
WESTVIEW DRCLAYMORE CTFalseFalse

补充(对齐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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:57:03