Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 过滤掉ANSI转义序列_Python_Ansi Escape - Fatal编程技术网

Python 过滤掉ANSI转义序列

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[

我有一个python脚本,它试图解释分别写入和读取stdout和stdin的数据跟踪。问题是这些数据充斥着我不关心的ANSI转义。这些转义是JSON编码的,因此它们看起来像“\033[A”和“\033]0;”。我实际上不需要解释代码,但我需要知道每个代码中包含多少个字符(您会注意到第一个序列是6个字符,第二个是7个字符)。有没有一种简单的方法可以从我的字符串中过滤出这些代码?

这还远远不够完美,但是这个正则表达式可能会让你达到以下目的:

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)