python正则表达式转义字符

2024-05-19 21:38:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有:

>>> 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[0米”胡说八道。我试过了

re.sub(str, r'(\x.*m)', '')

但这并没有成功。有什么想法吗?


Tags: sharebinliblocalexitrootjanprint
3条回答

你有几个问题:

  • 你给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)

您需要进行以下更改:

  • 避开反斜杠
  • 切换到非贪婪匹配。否则,第一个\x和最后一个m之间的所有内容都将被删除,当出现多个事件时这将是一个问题。
  • 参数的顺序不正确

结果:

re.sub(r'(\\x.*?m)', '', str)

这些是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终端,所以它不应该在输出中包含颜色代码。

相关问题 更多 >