用Python完成下面的需求,用尽量优雅的方式:
输入两个参数s和keys,s是一个字符串,keys是一个字符串列表,包含一系列关键词。函数需要把s中每一处和任一关键词相同的部分用<highlight>和</highlight>包围起来,连续的部分自动合并,比如输入s="你好大家好",keys=["好大", "大家"],需要输出"你<highlight>好大家</highlight>好"。注意关键字不会重复,但有可能包含,比如可能是["大", "大家"],s中无论是“大家”还是单独一个“大”字都需要highlight。
---------
按照标记的算法:定义keys个列表,用来记录每个key在s中的位置。
以s="你好大大家大家大家好",keys=["好大", "大家大"],为例:
先定义一个列表k,
对于关键字"好大",记"好大"在s中的起始位置数组k[0]=[(1,2)]
对于关键字"大家大",记"大家大"在s中的起始位置数组k[1]=[(3,5),(5,7)]
然后对k的每一个数组进行合并:
k[0]=[(1,2)]
k[1]=[(3,7)]
再对整个k进行合并:得到
kk = [(1,7)]
再用kk标记s,得到:
result = "你<highlight>好大大家大家大</highlight>家好"
def highlight(s, keys):
start_end_pairs = []
for key in keys:
start = 0
while True:
start = s.find(key, start)
if start == -1:
break
end = start + len(key)
start_end_pairs.append((start, end))
start += 1
start_end_pairs.sort()
merge_pairs = []
for pair in start_end_pairs:
if not merge_pairs:
merge_pairs.append(pair)
else:
last_pair = merge_pairs[-1]
if pair[0] <= last_pair[1]:
merge_pairs[-1] = (last_pair[0], max(last_pair[1], pair[1]))
else:
merge_pairs.append(pair)
result = []
start = 0
for pair in merge_pairs:
result.append(s[start:pair[0]])
result.append("<highlight>")
result.append(s[pair[0]:pair[1]])
result.append("</highlight>")
start = pair[1]
result.append(s[start:])
return "".join(result)