使用正则表达式功能突出显示多个单词

时间:2015-08-21 14:27:19

标签: python regex python-2.7

我编写了这个使用ANSI转义颜色突出显示单词的函数。 time(NULL)为红色,\033[91m为"重置"。

\033[39m

enter image description here

问:我的问题是该功能无法处理多个要突出显示的关键字(最好是可以在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

1 个答案:

答案 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