正则表达式用空格替换控制台代码

regex to replace console code with whitespaces

我正在为使用 console codes 的控制台应用程序编写一些 Python 测试,但我在优雅地处理 ESC H 序列时遇到了一些问题。

我有 s = r'\x1b[12;5H\nSomething' 输入字符串,我想用 Something 替换它。我正在尝试使用以下正则表达式:

re.sub(r'\x1b\[([0-9,A-Z]{1,2};([0-9]{1,2})H)', r'', s)

这当然会创建 5Something

我要的是

效果的东西

re.sub(r'\x1b\[([0-9,A-Z]{1,2};([0-9]{1,2})H)', ' '*(int(r'')-1), s)

也就是创建比第二个捕获组的空格数少一个

如果有一种方法可以简单地在字符串中呈现我在使用 print(s) 时得到的内容,我也会很高兴:

    Something

我正在使用 Python 3.

非常感谢!!

使用

import re
s = r'\x1b[12;5H\nSomething'
pattern = r'\x1b\[[0-9A-Z]{1,2};([0-9]{1,2})H\n'
print(re.sub(pattern, lambda x: ' '*(int(x.group(1))-1), s))

参见Python proof. See a regex proof

解释

--------------------------------------------------------------------------------
  \                       '\'
--------------------------------------------------------------------------------
  x1b                      'x1b'
--------------------------------------------------------------------------------
  \[                       '['
--------------------------------------------------------------------------------
  [0-9A-Z]{1,2}            any character of: '0' to '9', 'A' to 'Z'
                           (between 1 and 2 times (matching the most
                           amount possible))
--------------------------------------------------------------------------------
  ;                        ';'
--------------------------------------------------------------------------------
  (                        group and capture to :
--------------------------------------------------------------------------------
    [0-9]{1,2}               any character of: '0' to '9' (between 1
                             and 2 times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of 
--------------------------------------------------------------------------------
  H                        'H'
--------------------------------------------------------------------------------
  \                       '\'
--------------------------------------------------------------------------------
  n                        'n'