天天看點

文本高亮顯示 python

項目裡面有個需求:給搜尋框下面的自動補全清單比對内容高亮顯示

es高亮補全功能是使用的elastic search提供的completion suggester,但是該接口沒有對結果比對部分進行高亮顯示的功能,是以在不改變前述實作的情況下,寫一個通用函數,對結果清單中字元串進行高亮設定。

def highlight_text(highlight_string, list_res):
    for idx in range(len(list_res)):
        item = list_res[idx]
        item = "\033[0;31m" + highlight_string + "\033[0m" + item.replace(highlight_string, "")
        list_res[idx] = item
    for item in list_res:
        print item
           

上面第四行,是設定顔色的,可參考下表。

TEXT COLOR CODE TEXT STYLE CODE BACKGROUND COLOR CODE
Black 30 No effect Black 40
Red 31 Bold 1 Red 41
Green 32 Underline 2 Green 42
Yellow 33 Negative1 3 Yellow 43
Blue 34 Negative2 5 Blue 44
Purple 35 Purple 45
Cyan 36 Cyan 46
White 37 White 47

再舉幾個例子:

print("\033[0;37;40m Normal text\n")
print("\033[2;37;40m Underlined text\033[0;37;40m \n")
print("\033[1;37;40m Bright Colour\033[0;37;40m \n")
print("\033[3;37;40m Negative Colour\033[0;37;40m \n")
print("\033[5;37;40m Negative Colour\033[0;37;40m\n")
 
print("\033[1;37;40m \033[2;37:40m TextColour BlackBackground          TextColour GreyBackground                WhiteText ColouredBackground\033[0;37;40m\n")
print("\033[1;30;40m Dark Gray      \033[0m 1;30;40m            \033[0;30;47m Black      \033[0m 0;30;47m               \033[0;37;41m Black      \033[0m 0;37;41m")
print("\033[1;31;40m Bright Red     \033[0m 1;31;40m            \033[0;31;47m Red        \033[0m 0;31;47m               \033[0;37;42m Black      \033[0m 0;37;42m")
print("\033[1;32;40m Bright Green   \033[0m 1;32;40m            \033[0;32;47m Green      \033[0m 0;32;47m               \033[0;37;43m Black      \033[0m 0;37;43m")
print("\033[1;33;40m Yellow         \033[0m 1;33;40m            \033[0;33;47m Brown      \033[0m 0;33;47m               \033[0;37;44m Black      \033[0m 0;37;44m")
print("\033[1;34;40m Bright Blue    \033[0m 1;34;40m            \033[0;34;47m Blue       \033[0m 0;34;47m               \033[0;37;45m Black      \033[0m 0;37;45m")
print("\033[1;35;40m Bright Magenta \033[0m 1;35;40m            \033[0;35;47m Magenta    \033[0m 0;35;47m               \033[0;37;46m Black      \033[0m 0;37;46m")
print("\033[1;36;40m Bright Cyan    \033[0m 1;36;40m            \033[0;36;47m Cyan       \033[0m 0;36;47m               \033[0;37;47m Black      \033[0m 0;37;47m")
print("\033[1;37;40m White          \033[0m 1;37;40m            \033[0;37;40m Light Grey \033[0m 0;37;40m               \033[0;37;48m Black      \033[0m 0;37;48m")
           

該處參考:http://ozzmaker.com/add-colour-to-text-in-python/

下面是一種稍複雜一點的寫法,可保證高亮詞出現在字元串中間位置:

def highlight_text(highlight_string, list_res, color):
    for idx in range(len(list_res)):
        item = list_res[idx]
        match_str = re.finditer(highlight_string, item)
        item_highlighted = u""
        last_end = 0
        for it in match_str:
            it = it.regs[0]
            item_highlighted += item[last_end:it[0]] + u"<font color='" + color + u"'>" + highlight_string + u"</font>"
            last_end = it[1]
        item_highlighted += item[last_end:]
        list_res[idx] = item_highlighted

    for item in list_res:
        print item
           

上面支援一個句子中出現多次需要高亮的關鍵字,下面是使用python自帶的方法實作上述功能的代碼:

def highlight_text(highlight_string, list_res, color):
    for idx in range(len(list_res)):
        item = list_res[idx]
        item = re.sub(highlight_string, lambda m: "<font color='" + color + "'>" + m.group(0) + "</font>", item, flags=re.IGNORECASE)
        list_res[idx] = item

    for item in list_res:
        print item