如何在Python中突出正则表达式匹配?

8

我应该如何在句子中使用正则表达式来突出匹配项?我认为我可以使用匹配项的位置,就像我从以下代码中获取的位置一样:

s = "This is a sentence where I talk about interesting stuff like sencha tea."
spans = [m.span() for m in re.finditer(r'sen\w+', s)]

但是我如何强制终端在输出该字符串时更改那些span的颜色?
2个回答

15

有多种终端颜色包可用,例如termstyletermcolor。我喜欢colorama,它也适用于Windows。

以下是使用colorama执行所需操作的示例:

from colorama import init, Fore
import re

init() # only necessary on Windows
s = "This is a sentence where I talk about interesting stuff like sencha tea."
print(re.sub(r'(sen\w+)', Fore.RED + r'\1' + Fore.RESET, s))

4

要给文本上色,可以使用ANSI转义码。在Python中,您可以执行以下操作以从该点开始更改文本的颜色。

print '\033[' + str(code) + 'm'

在这里,code是来自这里的值。请注意,0将重置任何更改,30-37是颜色。因此,您想要在匹配之前插入'\033[' + str(code) + 'm',并在之后插入'\033[0m'以重置终端。例如,以下内容应该会输出您终端的所有颜色:

print 'break'.join('\033[{0}mcolour\33[0m'.format(i) for i in range(30, 38))

以下是您要求的一个混乱示例,与您所需的内容相关。
import re
colourFormat = '\033[{0}m'
colourStr = colourFormat.format(32)
resetStr = colourFormat.format(0)
s = "This is a sentence where I talk about interesting stuff like sencha tea."

lastMatch = 0
formattedText = ''
for match in re.finditer(r'sen\w+', s):
    start, end = match.span()
    formattedText += s[lastMatch: start]
    formattedText += colourStr
    formattedText += s[start: end]
    formattedText += resetStr
    lastMatch = end
formattedText += s[lastMatch:]

print formattedText

这比必要的要复杂得多。请查看我的(修订后的)回答。 - Nicholas Riley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接