この記事の目的
Pythonで以下の様に, 特定の単語をハイライトして出力するための関数を作成しました.
ページの最後にコード一覧があります.
解説
必要なライブラリはこれだけです.
import re
まず, 文字色や背景色を変更するための辞書を作成します.
今回は"yellow"
なら黄色の背景色, "red"
なら赤文字といったように設定してみました.
color_dic = {'yellow':'\033[43m', 'red':'\033[31m', 'blue':'\033[34m', 'end':'\033[0m'}
次にハイライトしたいキーワードを設定します. 今回は都道府県名をキーワードに設定しました.
keyword = ["東京都", "千葉県", "埼玉県", "神奈川県", ...]
上で設定したキーワードをfor文で順番に検索していくことになるのですが, ここでリストの並び順が重要になってきます. というのもキーワードによっては, 別のキーワードの部分文字列になっている可能性があるためです. 例えば, 市区町村の検索で
keyword = [... , "津市", "大津市", ...]
となっていた場合, 単純に左から単語を検索してヒットしたものに色を付けると以下のようになります.
そこで解決策として, リスト内の単語を文字数の長いものから順に並べます.
すると「大津市」を先に検索することになるので, 上のような問題は起きません.
以下がそのコードです.
#keyword = sorted(keyword, key=lambda x:len(x), reverse=True)
#コメントでより良い書き方をご指摘いただきました.
keyword.sort(key=len, reverse=True)
最後に, 出力するテキストと, キーワード, 色指定の情報を受けて, 出力を行う関数を作成します.
def print_hl(text, keyword, color="yellow"):
for kw in keyword:
bef = kw
aft = color_dic[color] + kw + color_dic["end"]
text = re.sub(bef, aft, text)
print(text)
実行例は以下の通りです.
text = "私は東京都に住んでいる"
print_hl(text, keyword)
以上!
コード一覧
import re
color_dic = {'yellow':'\033[43m', 'red':'\033[31m', 'blue':'\033[34m', 'end':'\033[0m'}
def print_hl(text, keyword, color="yellow"):
for kw in keyword:
bef = kw
aft = color_dic[color] + kw + color_dic["end"]
text = re.sub(bef, aft, text)
print(text)
keyword = ["東京都", "千葉県", "埼玉県", "神奈川県"]
keyword.sort(key=len, reverse=True)
text = "私は東京都に住んでいる"
print_hl(text, keyword)