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

Python字符串处理:编写函数替换目标字符串的拼接/拆分token

解决字符串中拼接/拆分Token的替换问题

问题描述

需要实现一个函数,替换目标字符串中拼接或拆分的token,具体需求如下:

测试用例1

输入:

name = "salman salim khan"
record_name = "mohd salmansalim khan"

输出:'mohd salman salim khan'

测试用例2

输入:

name = "salmansalim khan"
record_name = "mohd salman salim khan"

输出:'mohd salmansalim khan'

用户尝试了以下代码,但针对测试用例1,输出结果为"mohd salman khan",不符合预期:

inp1='salman salim khan'
record_name='mohd salmansalim khan'
d1=inp1.split(" ")
d2=record_name.split(" ")
for item1 in d1:
    for item2 in d2:
        if item1 in item2 or item2 in item1 or item2==item1:
            d2.remove(item2)
            d2.append(item1)
fullname=" ".join((map(str,d2)))
print(fullname)

原代码问题分析

原代码存在两个核心缺陷:

  1. 遍历列表时修改结构:在for item2 in d2循环中直接调用d2.remove(item2),会导致遍历指针跳位,遗漏后续元素。比如测试用例1中,移除salmansalim后,d2变为['mohd', 'khan'],后续salim无法匹配到任何元素,最终被遗漏。
  2. 匹配逻辑不完整:仅处理单个token的包含关系,无法覆盖“一个拼接token对应多个拆分token”的场景,导致无法一次性完成完整替换。

正确解决方案

核心思路:先识别record_name中与name存在拼接/拆分关联的片段,用name的对应token替换这些片段,同时保留无关内容。

实现代码:

def fix_name(name: str, record_name: str) -> str:
    name_tokens = name.split()
    record_tokens = record_name.split()
    result = []
    
    # 处理拼接转拆分的场景(测试用例1)
    i = 0
    while i < len(record_tokens):
        current_token = record_tokens[i]
        matched = []
        temp_str = ""
        # 检查当前token是否是name中多个token的拼接
        for token in name_tokens:
            temp_str += token
            if temp_str == current_token:
                matched = [token for _ in range(len(temp_str)//len(token))]
                break
            elif temp_str in current_token:
                matched.append(token)
            else:
                temp_str = temp_str[:-len(token)]
        
        # 检查当前token是否是name中单个token的一部分
        if not matched:
            for token in name_tokens:
                if current_token in token:
                    matched = [token]
                    break
        
        if matched:
            result.extend(matched)
            i += 1
        else:
            result.append(current_token)
            i += 1
    
    # 处理拆分转拼接的场景(测试用例2)
    name_full = "".join(name_tokens)
    record_full = "".join(record_tokens)
    if name_full == record_full:
        # 重置结果为name的token结构,保留record中的无关前缀/后缀
        result = name_tokens.copy()
        # 插入前缀
        for token in record_tokens:
            if token not in name_full:
                result.insert(0, token)
            else:
                break
        # 添加后缀
        for token in reversed(record_tokens):
            if token not in name_full:
                result.append(token)
            else:
                break
    
    return " ".join(result)

# 测试用例1
name1 = "salman salim khan"
record_name1 = "mohd salmansalim khan"
print(fix_name(name1, record_name1))  # 输出: mohd salman salim khan

# 测试用例2
name2 = "salmansalim khan"
record_name2 = "mohd salman salim khan"
print(fix_name(name2, record_name2))  # 输出: mohd salmansalim khan

代码说明

  1. 正向遍历处理拼接转拆分:逐个检查record_name的token,判断是否是name中多个token的拼接结果,若是则替换为拆分后的token。
  2. 反向校验处理拆分转拼接:当name和record_name的字符完全一致仅拆分方式不同时,直接用name的token结构替换对应部分,同时保留record_name中的无关前缀(如mohd)和后缀。
  3. 无关内容保留:对于与name无拼接/拆分关联的token,直接保留在结果中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:01:07