【问题标题】:python: coloring regex matchespython:着色正则表达式匹配
【发布时间】:2014-10-20 04:04:22
【问题描述】:

我有一个简单的 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

【问题讨论】:

    标签: python regex colors


    【解决方案1】:

    我会为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 的那个——我在原始实现中有一个难以追踪的错误,因为它与终端转义序列匹配。呸!

    【讨论】:

    • 你宁愿乱写stdout也不愿写print colorize(line),
    【解决方案2】:
    #!/usr/bin/env python3
    
    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)
        def flush(self):
            self.term.flush()
    
    sys.stdout = MyStdout()
    print ('this is an email: <someone@whatever.com>')
    print ('this is an ip: [1.1.1.1]')
    

    【讨论】:

      猜你喜欢
      • 2016-07-01
      • 2013-09-22
      • 2022-12-11
      • 2015-09-14
      • 2021-12-31
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多