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)
原代码问题分析
原代码存在两个核心缺陷:
- 遍历列表时修改结构:在
for item2 in d2循环中直接调用d2.remove(item2),会导致遍历指针跳位,遗漏后续元素。比如测试用例1中,移除salmansalim后,d2变为['mohd', 'khan'],后续salim无法匹配到任何元素,最终被遗漏。 - 匹配逻辑不完整:仅处理单个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
代码说明
- 正向遍历处理拼接转拆分:逐个检查
record_name的token,判断是否是name中多个token的拼接结果,若是则替换为拆分后的token。 - 反向校验处理拆分转拼接:当
name和record_name的字符完全一致仅拆分方式不同时,直接用name的token结构替换对应部分,同时保留record_name中的无关前缀(如mohd)和后缀。 - 无关内容保留:对于与
name无拼接/拆分关联的token,直接保留在结果中。
内容的提问来源于stack exchange,提问作者Chandan Vishwakarma
相关产品推荐
相关产品推荐

