9

stdout と stdin にそれぞれ書き込まれ、読み取られたデータのトレースを解釈しようとしている python スクリプトがあります。問題は、このデータが、私がどうでもいい ANSI エスケープで埋め尽くされていることです。これらのエスケープは JSON でエンコードされているため、"\033[A" および "\033]0;" のようになります。実際にコードを解釈する必要はありませんが、それぞれに含まれる文字数を知る必要があります (最初のシーケンスは 6 文字で、2 番目のシーケンスは 7 文字であることがわかります)。私が持っている文字列からこれらのコードを除外する簡単な方法はありますか?

4

6 に答える 6

13

コントロール シーケンス (別名 ANSI エスケープ シーケンス) の完全な正規表現は次のとおりです。

/(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]/

ECMA-48 セクション 5.4およびANSI エスケープ コードを参照してください。

于 2015-11-25T20:09:22.593 に答える
3
#!/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
于 2013-02-07T07:46:23.513 に答える
2

これは私のために働いた:

re.sub(r'\x1b\[[\d;]+m', '', s)
于 2017-03-21T07:56:40.493 に答える
0

FWIW、このPython正規表現は私にとってはうまくいくようでした。それが正確かどうかは実際にはわかりませんが、経験的には機能しているようです。

r'\\033[\[\]]([0-9]{1,2}([;@][0-9]{0,2})*)*[mKP]?'
于 2012-11-25T02:38:52.107 に答える
0

完璧にはほど遠いですが、この正規表現はどこかに到達する可能性があります:

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

2 つの例は既に正しく削除されています。

于 2012-11-22T05:37:53.773 に答える