指定关键词,在一段文本中搜索并在关键词前后进行插入自定义字符串

分享自己写的一段代码。该代码可以实现如下的功能:

输入“我是蜘蛛侠,我从小就活泼好动,还抢过美国队长的盾“这句话,并且指定关键词【美国队长, 蜘蛛侠】,在关键词的前后增加html标签b来进行加粗。

得到输出“我是蜘蛛侠,我从小就活泼好动,还抢过美国队长的盾“

调用方法

input_str = "我是蜘蛛侠,我从小就活泼好动,还抢过美国队长的盾"
keyword_list = ["美国队长", "蜘蛛侠"]
output = search_and_add(input_str, keyword_list, "<b>", "</b>")
print(output)
from operator import itemgetter

def search_and_add(input_str, str_list, prefix, suffix):
    """
    輸入一段文字,用str_list的短語去搜索,如果命中的話,則在命中的短語前後添加prefix和suffix。
    如search_and_add("abcdefg", ['b', 'd'], "<u>", "</u>") 則輸出為a<u>b</u>c<u>d</u>efg
    :param input_str:
    :param str_list:
    :param prefix:
    :param suffix:
    :return:
    """
    str_length_map = {s: len(s) for s in str_list}
    sorted_tuple = sorted(str_length_map.items(), key=itemgetter(1), reverse=True)
    target_list = [i[0] for i in sorted_tuple]

    arr = []
    _search_and_add(input_str, target_list, arr, prefix, suffix)
    result = ""
    for item in arr:
        result += item
    return result


def _search_and_add(input_str, str_list, arr, prefix, suffix):
    """
    嵌套調用自身
    :param input_str:
    :param str_list:
    :param arr:
    :return:
    """
    cut_result = cut_3(input_str, str_list, prefix, suffix)
    if cut_result is None:
        arr.append(input_str)
        return
    left = cut_result[0]
    middle = cut_result[1]
    right = cut_result[2]
    if left != "":
        _search_and_add(left, str_list, arr, prefix, suffix)
    arr.append(middle)
    if right != "":
        _search_and_add(right, str_list, arr, prefix, suffix)


def cut_3(input_str, str_list, prefix, suffix):
    """
    传入一个字符串,如果能被str_list中的某一个短语cut的话,则返回三段式,如果没有可以cut的短语,则返回None
    :param input_str:
    :param str_list:
    :return:
    """
    for target in str_list:
        if target not in input_str:
            continue
        index = input_str.index(target)
        if index == 0:
            # 首命中
            return ["", prefix + target + suffix, input_str[index + len(target):]];
        elif (index + len(target)) == len(input_str):
            # 尾命中
            return [input_str[0:index], prefix + target + suffix, ""];
        else:
            # 中间命中
            return [input_str[0:index], prefix + target + suffix, input_str[index + len(target):]];
    return None


if __name__ == '__main__':
    print(search_and_add("abcdefgabcdefg", ['abcdef','abcdefg'], "<u>", "</u>"))

猜你喜欢

转载自blog.csdn.net/leon_wzm/article/details/78653618