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
5
A
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)
7
Các regexp hoàn toàn kiểm soát Sequences (aka ANSI thoát Sequences) là
/(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]/
tham khảo ECMA-48 Section 5.4 và ANSI escape code
1
này đã làm việc cho tôi:
re.sub(r'\x1b\[[\d;]+m', '', s)
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