2012-11-22 30 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)