python:着色正则表达式匹配

时间:2014-08-26 18:11:10

标签: python regex colors

我有一个简单的python脚本,我逐行读取文件:

while True:
   line = f.readline()
   if line:
      print line,
   else:
      time.sleep(0.1)

除其他事项外,这些行还包含[IP addresses]<email addresses>中的[]<>

我想正常打印整行,但是括号内的文字(即IP和电子邮件)有不同的颜色,例如'\033[38;5;180m'

最好的方法是什么?

我正在使用python 2.7

1 个答案:

答案 0 :(得分:2)

我会为sys.stdout安装自定义处理程序,因此您无需担心更改现有代码 - print会为您处理着色。实际的文本替换可以通过几次正则表达式来完成。*

import sys
import re

def colorize(text):
    # Underline <email addresses>:
    text = re.sub('<.*>',lambda m: '\x1b[4m{}\x1b[0m'.format(m.group()), text)
    # Make [IP addresses] peach:
    return re.sub('\[[0-9.]*\]',lambda m: '\x1b[38;5;180m{}\x1b[0m'.format(m.group()), text)

class MyStdout(object):
    def __init__(self, term=sys.stdout):
        self.term = term
    def write(self, text):
        text = colorize(text)
        self.term.write(text)

sys.stdout = MyStdout()
print 'this is an email: <someone@whatever.com>'
print 'this is an ip: [1.1.1.1]'

这会突出显示电子邮件地址,并使您提供的颜色为IP。

*关于正则表达式的注释。小心匹配括号/ IP的那个 - 我在原始实现中有一个难以跟踪的错误,因为它匹配终端转义序列。呸!