2012-11-22 33 views
5

我有一个python脚本试图解释写入和读取stdout和stdin分别的数据跟踪。问题是这个数据充斥着我不关心的ANSI转义。这些转义符是JSON编码的,因此它们看起来像“\ 033 [A”和“\ 033] 0;”。我实际上并不需要解释代码,但我需要知道每个代码中包含多少个字符(您会注意到第一个序列是6个字符,而第二个是7)。有没有一种简单的方法可以从我拥有的字符串中筛选出这些代码?过滤出ANSI转义序列

+0

的'colcrt'程序已经这样做了。它不在Python中,但如果这是一个需求,它可能被移植或封装。 – tripleee

回答

0

这是远远不够完善,但是这正则表达式可以让你somwhere:

import re 
text = r'begin \033[A middle \033]0; end' 
print re.sub(r'\\[0-9]+(\[|\])[0-9]*;?[A-Z]?', '', text) 

它已经正确地删除你的两个例子。

0

FWIW,这个Python正则表达式似乎适用于我。我真的不知道,如果它是准确的,但经验似乎工作:

r'\\033[\[\]]([0-9]{1,2}([;@][0-9]{0,2})*)*[mKP]?' 
1
#!/usr/bin/env python 
import re 

ansi_pattern = '\033\[((?:\d|;)*)([a-zA-Z])' 
ansi_eng = re.compile(ansi_pattern) 

def strip_escape(string=''): 
    lastend = 0 
    matches = [] 
    newstring = str(string) 
    for match in ansi_eng.finditer(string): 
     start = match.start() 
     end = match.end() 
     matches.append(match) 
    matches.reverse() 
    for match in matches: 
     start = match.start() 
     end = match.end() 
     string = string[0:start] + string[end:] 
    return string 

if __name__ == '__main__': 
    import sys 
    import os 

    lname = sys.argv[-1] 
    fname = os.path.basename(__file__) 
    if lname != fname: 
     with open(lname, 'r') as fd: 
      for line in fd.readlines(): 
       print strip_escape(line).rstrip() 
    else: 
     USAGE = '%s <filename>' % fname 
     print USAGE 
6

另一个变化:

def strip_ansi_codes(s): 
    """ 
    >>> import blessings 
    >>> term = blessings.Terminal() 
    >>> foo = 'hidden'+term.clear_bol+'foo'+term.color(5)+'bar'+term.color(255)+'baz' 
    >>> repr(strip_ansi_codes(foo)) 
    u'hiddenfoobarbaz' 
    """ 
    return re.sub(r'\x1b\[([0-9,A-Z]{1,2}(;[0-9]{1,2})?(;[0-9]{3})?)?[m|K]?', '', s) 
1

这为我工作:

re.sub(r'\x1b\[[\d;]+m', '', s)