Python 使用正则表达式函数突出显示多个单词

Python 使用正则表达式函数突出显示多个单词,python,regex,python-2.7,Python,Regex,Python 2.7,我用ANSI转义颜色编写了这个突出显示单词的函数\033[91m为红色,\033[39m为“重置” Q:我的问题是,该函数无法处理多个要突出显示的关键字(最好可以在关键字中输入任意数量的单词)。它也不区分大小写。我该怎么做才能解决这个问题 我想一个选择是使用re.sub,或者使用|和ignorecase通过flags=re.I来分离关键字。我已经做了各种尝试,但我没有达到目的 本例正确地突出显示了单词,但不幸的是,除了单词本身之外,它放弃了所有内容。它也不能处理多个单词 您的代码的问题是您正

我用ANSI转义颜色编写了这个突出显示单词的函数<代码>\033[91m为红色,
\033[39m
为“重置”

Q:我的问题是,该函数无法处理多个要突出显示的关键字(最好可以在
关键字中输入任意数量的单词)。它也不区分大小写。我该怎么做才能解决这个问题


我想一个选择是使用
re.sub
,或者使用
|
和ignorecase通过
flags=re.I
来分离关键字。我已经做了各种尝试,但我没有达到目的

本例正确地突出显示了单词,但不幸的是,除了单词本身之外,它放弃了所有内容。它也不能处理多个单词


您的代码的问题是您正在替换整个
文本。此外,我认为您应该在模式中转义
关键字,而不是在替换中转义!尝试以下操作:

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
如果需要更多控制,还可以使用callable;匹配项作为参数传递

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

您还应该能够使用.format使这个python3更加友好,例如replacement=“\033[91m{}\033[39m.format(关键字)。注意,python 2.5及以下版本没有.format和2.6,我相信需要您使用{0}而不是{}-RTFM来获得更多信息
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