这是我的字符串:
'ls\r\n\x1b[00m\x1b[01;31mexamplefile.zip\x1b[00m\r\n\x1b[01;31m'
我正在使用代码从SSH命令检索输出,并且我希望我的字符串仅包含'examplefile.zip'
如何删除多余的转义序列?
使用正则表达式删除它们:
import re
# 7-bit C1 ANSI sequences
ansi_escape = re.compile(r'''
\x1B # ESC
(?: # 7-bit C1 Fe (except CSI)
[@-Z\\-_]
| # or [ for CSI, followed by a control sequence
\[
[0-?]* # Parameter bytes
[ -/]* # Intermediate bytes
[@-~] # Final byte
)
''', re.VERBOSE)
result = ansi_escape.sub('', sometext)
或者,在没有VERBOSE标志的情况下,以压缩形式:
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
result = ansi_escape.sub('', sometext)
演示:
>>> import re
>>> ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
>>> sometext = 'ls\r\n\x1b[00m\x1b[01;31mexamplefile.zip\x1b[00m\r\n\x1b[01;31m'
>>> ansi_escape.sub('', sometext)
'ls\r\nexamplefile.zip\r\n'
上面的正则表达式涵盖所有7位ANSI C1转义序列,但不包括8位C1转义序列打开器。后者在当今的UTF-8世界中从未使用过,在UTF-8世界中,相同范围的字节具有不同的含义。
如果你确实也需要覆盖8位代码(然后大概使用bytes值),则正则表达式将变成如下所示的字节模式:
# 7-bit and 8-bit C1 ANSI sequences
ansi_escape_8bit = re.compile(br'''
(?: # either 7-bit C1, two bytes, ESC Fe (omitting CSI)
\x1B
[@-Z\\-_]
| # or a single 8-bit byte Fe (omitting CSI)
[\x80-\x9A\x9C-\x9F]
| # or CSI + control codes
(?: # 7-bit CSI, ESC [
\x1B\[
| # 8-bit CSI, 9B
\x9B
)
[0-?]* # Parameter bytes
[ -/]* # Intermediate bytes
[@-~] # Final byte
)
''', re.VERBOSE)
result = ansi_escape_8bit.sub(b'', somebytesvalue)
可以浓缩为
# 7-bit and 8-bit C1 ANSI sequences
ansi_escape_8bit = re.compile(
br'(?:\x1B[@-Z\\-_]|[\x80-\x9A\x9C-\x9F]|(?:\x1B\[|\x9B)[0-?]*[ -/]*[@-~])'
)
result = ansi_escape_8bit.sub(b'', somebytesvalue)
有关更多信息,请参见:
ECMA-48标准,第5版(尤其是第5.3和5.3节)
你提供的示例包含4个CSI(控制序列介绍者)代码(以\x1B
[或ESC
[开头字节标记),并且每个示例都包含一个SGR(选择图形呈现)代码,因为它们均以结尾m。这些参数;之间的参数(以分号分隔)告诉你的终端要使用哪些图形再现属性。因此,对于每个\x1B[....m
序列,使用的3个代码是:
0(或00在此示例中):reset,禁用所有属性
但是,ANSI不仅仅是CSI SGR代码。仅使用CSI,你还可以控制光标,清除行或整个显示或滚动(当然,前提是终端支持此功能)。除CSI外,还有一些代码可以选择其他字体(SS2和SS3
),发送“私人消息”(例如密码),与终端(DCS
),操作系统(OSC
)或应用程序本身(APC
,这是应用程序实现将自定义控制代码搭载在通信流上),以及用于帮助定义字符串(SOS
,字符串的开始,ST字符串终止符)或将所有内容重置为基本状态的其他代码(RIS
)。以上正则表达式涵盖了所有这些。
请注意,上述正则表达式仅删除ANSI C1代码,而不会删除这些代码可能正在标记的任何其他数据(例如OSC打开程序和终止ST代码之间发送的字符串)。删除这些将需要在此答案范围之外的其他工作。
我想转动这根绳子: 到这个里面 用似乎没有明显的方法来做到这一点? 更准确地说,我想将反斜杠的转义改为转义字符。
问题内容: 我正在使用自动化,并使用Jsch连接到远程设备并自动执行一些任务。 我在解析命令结果时遇到问题,因为有时它们带有ANSI Control chars 。 目前,我正在尝试此操作,但我不确定它是否足够完整。 如何从Java字符串中删除ANSI控制字符(VT100)? 问题答案: 大多数ANSI VT100序列的格式为 (可选)后跟一个数字或由分隔的两个数字,后接一些不是数字或。的字符。所
问题内容: 我想从字符串列表中删除所有类型的转义序列。我怎样才能做到这一点?输入: 输出: http://docs.python.org/reference/lexical_analysis.html#string- literals 问题答案: 像这样吗 编辑 :好的,那不是您想要的。通常,您无法完成所需的操作,因为正如@Sven Marnach解释的那样,字符串实际上并不包含转义序列。这些只是
本文向大家介绍如何从Python的字符串列表中删除空字符串?,包括了如何从Python的字符串列表中删除空字符串?的使用技巧和注意事项,需要的朋友参考一下 您可以使用过滤器过滤掉空字符串。filter的第一个参数是lambda,它将告诉您字符串是否为空。您可以将此lambda传递为None,bool,len或检查字符串是否为空的函数。您可以通过以下几种方式进行检查: 请单击下面的链接以查看带有简单
问题内容: 例如,有一个字符串。。 如何从中删除中间字符M?我不需要代码。我想知道: Python中的字符串是否以任何特殊字符结尾? 哪种更好的方法-从中间字符或创建新字符串开始,将所有内容从右移到左,而不是复制中间字符? 问题答案: 在Python中,字符串是不可变的,因此你必须创建一个新字符串。你有一些关于如何创建新字符串的选项。如果要删除出现的,请执行以下操作: 如果要删除中心字符: 你询问
问题内容: 我使用一个向字符串添加ANSI颜色/样式的库。例如: 当我做: 一个白色和大胆消息将被输出。 像这样如何删除这些元素的字符串? 也许是一个很好的正则表达式?还是有任何内置功能? 我当时想的工作是创建子进程: 但是输出是一样的… 问题答案: 您 应该 使用的正则表达式是 这不仅匹配颜色,还匹配大多数ANSI转义代码,包括扩展的VT100代码,古旧/专有打印机代码等。 请注意,上述正则表达