Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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正则表达式转义字符_Python_Regex_Ansi Escape - Fatal编程技术网

python正则表达式转义字符

python正则表达式转义字符,python,regex,ansi-escape,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 \

我们有:

>>> 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)', '')

但这并没有奏效。有什么想法吗?

您需要进行以下更改:

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

re.sub(r'(\\x.*?m)', '', str)
您有几个问题:

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

    re.sub(regexp\u模式、替换、源字符串)

  • 字符串不包含“\x”。该“\x1b”是转义字符,是单个字符

  • 正如interjay指出的,您需要“*?”而不是“*”,因为否则它将匹配从第一次逃逸到最后一个“m”的所有内容

对re.sub的正确调用是:

print re.sub('\x1b.*?m', '', s)
或者,您可以使用:

print re.sub('\x1b[^m]*m', '', s)
这些是。它们由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终端,因此它的输出中不应该包含颜色代码。

这里是一个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
中。请尝试运行
ls--color=never-l
,这样您就不会得到ANSI转义码了。

@interjay:啊,对不起,搞错了,谢谢。但是,这不起作用。它没有密码,但所有的废话都还在那里。我没有注意到e反斜杠实际上不是反斜杠-请看爱德华的回答,他说得对。@Edward loper:非常感谢,很抱歉把参数弄错了。这是一个很容易犯的错误;我花了一段时间才习惯Python regexp参数的顺序。基本规则是第一个参数始终是regexp,最后一个参数是要操作的字符串(除了可选参数,如标志或计数,它们位于要操作的字符串后面的末尾)