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