我有一个 python 脚本,它试图解释分别写入和读取 stdout 和 stdin 的数据跟踪。问题是这些数据充满了我不关心的 ANSI 转义。这些转义是 JSON 编码的,所以它们看起来像“\033[A”和“\033]0;”。我实际上不需要解释代码,但我确实需要知道每个代码中包含多少个字符(您会注意到第一个序列是 6 个字符,而第二个是 7 个字符)。有没有一种直接的方法可以从我拥有的字符串中过滤掉这些代码?
问问题
8908 次
6 回答
13
于 2015-11-25T20:09:22.593 回答
8
另一种变体:
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)
于 2013-04-03T06:51:40.230 回答
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
它远非完美,但这个正则表达式可能会让你有所收获:
import re
text = r'begin \033[A middle \033]0; end'
print re.sub(r'\\[0-9]+(\[|\])[0-9]*;?[A-Z]?', '', text)
它已经正确删除了您的两个示例。
于 2012-11-22T05:37:53.773 回答
0
FWIW,这个 Python 正则表达式似乎对我有用。我实际上不知道它是否准确,但从经验上看它似乎有效:
r'\\033[\[\]]([0-9]{1,2}([;@][0-9]{0,2})*)*[mKP]?'
于 2012-11-25T02:38:52.107 回答