我编写了这个使用ANSI转义颜色突出显示单词的函数。 time(NULL)
为红色,\033[91m
为"重置"。
\033[39m
问:我的问题是该功能无法处理多个要突出显示的关键字(最好是可以在def highlight(text, keyword):
text = text.replace(keyword, "\033[91m" + keyword + "\033[39m")
print text
highlight("This word is red.", "word")
中输入任意数量的字词)。它也不区分大小写。我该怎么做才能解决这个问题?
我想一个选项是使用keyword
,也许使用re.sub
分隔关键字,然后按|
忽略。我做了各种尝试,但我没有到达那里。
此示例正确地突出显示该单词,但遗憾的是丢弃了除单词本身之外的所有内容。它也无法处理多个单词。
flags=re.I
答案 0 :(得分:2)
您的代码存在的问题是您要替换整个 text
。另外,我认为你应该在模式中逃避keyword
,而不是替换!试试这个:
def highlight_one(text, keyword):
replacement = "\033[91m" + keyword + "\033[39m"
text = re.sub(re.escape(keyword), replacement, text, flags=re.I)
print text
如果您想要突出显示多个关键字(作为列表传递),您确实可以使用|
加入它们,然后使用\1
来引用替换中的匹配。
def highlight_many(text, keywords):
replacement = "\033[91m" + "\\1" + "\033[39m"
text = re.sub("(" + "|".join(map(re.escape, keywords)) + ")", replacement, text, flags=re.I)
print text
如果你想要更多的控制,你也可以使用一个可调用的;匹配作为参数传递。
def highlight_many(text, keywords):
replacement = lambda match: "\033[91m" + match.group() + "\033[39m"
text = re.sub("|".join(map(re.escape, keywords)), replacement, text, flags=re.I)
print text