2012-11-22 32 views
5

Tôi có một tập lệnh python đang cố gắng giải thích một dấu vết của dữ liệu được ghi và đọc từ stdout và stdin, tương ứng. Vấn đề là dữ liệu này được kiểm tra bằng cách thoát ANSI mà tôi không quan tâm. Những lần thoát này được mã hóa JSON, vì vậy chúng trông giống như "\ 033 [A" và "\ 033] 0;". Tôi không thực sự cần phải giải thích các mã, nhưng tôi cần phải biết có bao nhiêu ký tự được bao gồm trong mỗi (bạn sẽ nhận thấy chuỗi đầu tiên là 6 ký tự trong khi thứ hai là 7). Có cách nào đơn giản để lọc ra các mã này từ các chuỗi tôi có không?Lọc ra các chuỗi thoát ANSI

+0

Lệnh 'chương trình colcrt' đã thực hiện điều này. Nó không phải trong Python, nhưng nếu đó là một yêu cầu, nó có thể được chuyển hoặc gói. – tripleee

Trả lời

0

Đó là xa hoàn hảo, nhưng regex này có thể giúp bạn có được somwhere:

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

Nó đã loại bỏ hai ví dụ của bạn một cách chính xác.

0

FWIW, regex Python này có vẻ phù hợp với tôi. Tôi không thực sự biết nếu đó là chính xác, nhưng theo kinh nghiệm có vẻ như để làm việc:

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

Một biến thể:

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

này đã làm việc cho tôi:

re.sub(r'\x1b\[[\d;]+m', '', s) 
Các vấn đề liên quan