Python 过滤掉ANSI转义序列
我有一个python脚本,它试图解释分别写入和读取stdout和stdin的数据跟踪。问题是这些数据充斥着我不关心的ANSI转义。这些转义是JSON编码的,因此它们看起来像“\033[A”和“\033]0;”。我实际上不需要解释代码,但我需要知道每个代码中包含多少个字符(您会注意到第一个序列是6个字符,第二个是7个字符)。有没有一种简单的方法可以从我的字符串中过滤出这些代码?这还远远不够完美,但是这个正则表达式可能会让你达到以下目的:Python 过滤掉ANSI转义序列,python,ansi-escape,Python,Ansi Escape,我有一个python脚本,它试图解释分别写入和读取stdout和stdin的数据跟踪。问题是这些数据充斥着我不关心的ANSI转义。这些转义是JSON编码的,因此它们看起来像“\033[A”和“\033]0;”。我实际上不需要解释代码,但我需要知道每个代码中包含多少个字符(您会注意到第一个序列是6个字符,第二个是7个字符)。有没有一种简单的方法可以从我的字符串中过滤出这些代码?这还远远不够完美,但是这个正则表达式可能会让你达到以下目的: import re text = r'begin \033[
import re
text = r'begin \033[A middle \033]0; end'
print re.sub(r'\\[0-9]+(\[|\])[0-9]*;?[A-Z]?', '', text)
它已经正确地删除了您的两个示例。FWIW,这个Python正则表达式似乎适合我。我不知道它是否准确,但从经验上看,它似乎有效:
r'\\033[\[\]]([0-9]{1,2}([;@][0-9]{0,2})*)*[mKP]?'
#/usr/bin/env python
进口稀土
ansi|U模式=“\033\[((?:\d |))*)([a-zA-Z])”
ansi_eng=重新编译(ansi_模式)
def strip_转义(字符串=“”):
lastend=0
匹配项=[]
newstring=str(字符串)
对于ansi_eng.finditer中的匹配(字符串):
start=match.start()
end=match.end()
匹配。追加(匹配)
匹配。反向()
对于匹配中的匹配:
start=match.start()
end=match.end()
字符串=字符串[0:开始]+字符串[结束:]
返回字符串
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
导入操作系统
lname=sys.argv[-1]
fname=os.path.basename(_文件__)
如果lname!=fname:
将open(lname,'r')作为fd:
对于fd.readlines()中的行:
打印条带\u转义(行).rstrip()
其他:
用法=“%s”%fname
打印使用
另一种变体:
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)
控制序列(又称ANSI转义序列)的完整regexp是 请参阅和这对我来说很有效:
re.sub(r'\x1b\[[\d;]+m', '', s)
colcrt
程序已经做到了这一点。它不是Python语言,但是如果这是一个要求,它可以被移植或包装。你不应该把你的答案从一个问题复制到另一个问题。
/(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]/
re.sub(r'\x1b\[[\d;]+m', '', s)