python正则表达式转义字符

tam*_*amb 2 python regex ansi-escape

我们有:

>>> 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
Run Code Online (Sandbox Code Playgroud)

我想用regexp摆脱所有'\ xblah [0m'废话.我试过了

re.sub(str, r'(\x.*m)', '')
Run Code Online (Sandbox Code Playgroud)

但这并没有成功.有任何想法吗?

Edw*_*per 11

你有几个问题:

  • 你以错误的顺序将参数传递给re.sub错误.它应该是:

    re.sub(regexp_pattern,replacement,source_string)

  • 该字符串不包含"\ x"."\ x1b"是转义字符,它是一个单个字符.

  • 正如interjay指出的那样,你想要".*?" 而不是".*",因为否则它将匹配从第一个逃逸到最后一个"m"的所有内容.

对re.sub的正确调用是:

print re.sub('\x1b.*?m', '', s)
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用:

print re.sub('\x1b[^m]*m', '', s)
Run Code Online (Sandbox Code Playgroud)