我们有:
>>> str
'exit\r\ndrwxr-xr-x 2 root root 0 Jan 1 2000
\x1b[1;34mbin\x1b[0m\r\ndrwxr-xr-x 3 root root
0 Jan 1 2000 \x1b[1;34mlib\x1b[0m\r\ndrwxr-xr-x 10 root
root 0 Jan 1 1970 \x1b[1;34mlocal\x1b[0m\r\ndrwxr-xr-x
2 root root 0 Jan 1 2000 \x1b[1;34msbin\x1b[0m\r\ndrwxr-xr-x
5 root root 0 Jan 1 2000 \x1b[1;34mshare\x1b[0m\r\n# exit\r\n'
>>> print str
exit
drwxr-xr-x 2 root root 0 Jan 1 2000 bin
drwxr-xr-x 3 root root 0 Jan 1 2000 lib
drwxr-xr-x 10 root root 0 Jan 1 1970 local
drwxr-xr-x 2 root root 0 Jan 1 2000 sbin
drwxr-xr-x 5 root root 0 Jan 1 2000 share
# exit
我想用regexp摆脱所有'\ xblah [0m'废话。我试过了
re.sub(str, r'(\x.*m)', '')
但这并没有成功。有什么想法吗?
答案 0 :(得分:11)
你有几个问题:
你以错误的顺序将参数传递给re.sub错误。它应该是:
re.sub(regexp_pattern,replacement,source_string)
该字符串不包含“\ x”。 “\ x1b”是转义字符,它是一个单个字符。
正如interjay指出的那样,你想要“。*?”而不是“。*”,因为否则它将匹配从第一个逃逸到最后一个“m”的所有内容。
对re.sub的正确调用是:
print re.sub('\x1b.*?m', '', s)
或者,您可以使用:
print re.sub('\x1b[^m]*m', '', s)
答案 1 :(得分:3)
您需要进行以下更改:
\x
和最后一个m
之间的所有内容都将被删除,如果出现多次,这将是一个问题。结果:
re.sub(r'(\\x.*?m)', '', str)
答案 2 :(得分:3)
这些是ANSI terminal codes。它们由ESC(字节27,在Python中显示为\x1B
)后跟[
,然后是一些;
- 分隔的参数以及最后一个字母来指示它是什么命令。 (m
是换色。)
参数通常是数字,所以对于这个简单的情况,你可以用以下方法摆脱它们:
ansisequence= re.compile(r'\x1B\[[^A-Za-z]*[A-Za-z]')
ansisequence.sub('', string)
从技术上讲,对于某些(非颜色相关的)控制代码,它们可能是通用字符串,这使解析变得烦人。很少见到你会遇到这些,但如果你这样做,我想你必须使用像以下那样复杂的东西:
\x1B\[((\d+|"[^"]*")(;(\d+|"[^"]*"))*)?[A-Za-z]
最好是说服生成不是ANSI终端的字符串,这样就不应该在输出中包含颜色代码。
答案 3 :(得分:2)
尝试改为运行ls --color=never -l
,并且您不会首先获得ANSI转义码。
答案 4 :(得分:1)
这是针对您的问题的pyparsing解决方案,具有针对那些讨厌的转义序列的一般解析表达式。通过使用抑制表达式转换初始字符串,将返回剥离表达式的所有匹配项的字符串。
s = \
'exit\r\ndrwxr-xr-x 2 root root 0 Jan 1 2000 ' \
'\x1b[1;34mbin\x1b[0m\r\ndrwxr-xr-x 3 root root ' \
'0 Jan 1 2000 \x1b[1;34mlib\x1b[0m\r\ndrwxr-xr-x 10 root ' \
'root 0 Jan 1 1970 \x1b[1;34mlocal\x1b[0m\r\ndrwxr-xr-x ' \
'2 root root 0 Jan 1 2000 \x1b[1;34msbin\x1b[0m\r\ndrwxr-xr-x ' \
'5 root root 0 Jan 1 2000 \x1b[1;34mshare\x1b[0m\r\n# exit\r\n' \
from pyparsing import (Literal, Word, nums, Combine,
delimitedList, oneOf, alphas, Suppress)
ESC = Literal('\x1b')
integer = Word(nums)
escapeSeq = Combine(ESC + '[' + delimitedList(integer,';') + oneOf(list(alphas)))
s_prime = Suppress(escapeSeq).transformString(s)
print s_prime
这将打印您所需的输出,存储在s_prime
。