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)
Các vấn đề liên quan
- 1. Phân tích mã màu ANSI thoát trong trình duyệt?
- 2. Đọc Device Status Report ANSI dãy thoát trả lời
- 3. Cách ẩn mã thoát màu ANSI từ fmt
- 4. Lọc ra các thẻ neo trong một chuỗi
- 5. Chuyển đổi chuỗi ANSI thoát sang HTML bằng cách sử dụng PHP
- 6. lỗi ansi-term/multi-term trong bộ lọc quy trình
- 7. Thoát các chuỗi sed đúng
- 8. Lấy chuỗi dài đúng bằng Python cho chuỗi có mã màu ANSI
- 9. Thêm chuỗi màu ANSI thoát ra một kết quả nhanh chóng bash ở vị trí con trỏ xấu khi nhớ lại/chỉnh sửa lệnh
- 10. Bỏ qua các chuỗi thoát Regex C#
- 11. Java: Bỏ qua các chuỗi thoát
- 12. Cách nhận dạng mã thoát màu ansi trong thiết bị đầu cuối 64 bit của Windows7
- 13. Bỏ qua các chuỗi thoát trong chuỗi java?
- 14. Lọc các phần tử chuỗi NSArray
- 15. sử dụng HTMLPurifier cho đầu vào hoặc đầu ra thoát/lọc
- 16. Cách đúng để thoát khỏi các ký tự trong Biểu thức Lọc DataTable
- 17. Chuỗi thoát cho JavaScript bằng Jinja2?
- 18. thoát chuỗi từ EditText
- 19. perl \ @ thoát chuỗi
- 20. Thoát các chuỗi ký tự JavaScript trong các khung nhìn
- 21. Chuỗi thoát cho chuỗi của Lua.format
- 22. thoát khỏi chuỗi chính, có thoát khác không?
- 23. Làm thế nào để loại bỏ tất cả các chuỗi thoát khỏi danh sách các chuỗi?
- 24. Powershell: danh sách chuỗi lọc
- 25. Lọc đầu ra lệnh Linux
- 26. Chuỗi thoát Python cho MySQL
- 27. Chuỗi JSON và cách xử lý các ký tự thoát
- 28. Chuỗi thoát với python mysql.connector
- 29. jQuery: lọc ra các phần tử thông qua lớp học?
- 30. Lọc ra các lớp của một phần tử trong jQuery?
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