2

我正在为使用控制台代码的控制台应用程序编写一些 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'\2', s)

这当然会创建5Something.

我想要的是某种效果

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

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

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

    Something

我正在使用 Python 3。

非常感谢!!

4

1 回答 1

1

采用

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 证明。请参阅正则表达式证明

解释

--------------------------------------------------------------------------------
  \\                       '\'
--------------------------------------------------------------------------------
  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 \1:
--------------------------------------------------------------------------------
    [0-9]{1,2}               any character of: '0' to '9' (between 1
                             and 2 times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  H                        'H'
--------------------------------------------------------------------------------
  \\                       '\'
--------------------------------------------------------------------------------
  n                        'n'
于 2021-02-15T22:34:55.873 回答