Python 字符串高亮算法

用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)

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值