使用单个替换操作将所有前导选项卡替换为空格

phk*_*phk 4 python regex

在我的文本中,我想用两个空格替换所有前导选项卡,但只留下非前导选项卡.

例如:

a
\tb
\t\tc
\td\te
f\t\tg
Run Code Online (Sandbox Code Playgroud)

("a\n\tb\n\t\tc\n\td\te\nf\t\tg")

应该变成:

a
  b
    c
  d\te
f\t\tg
Run Code Online (Sandbox Code Playgroud)

("a\n b\n c\n d\te\nf\t\tg")

对于我的情况,我可以通过多次替换操作来执行此操作,重复与许多最大嵌套级别一样多次,或者直到没有任何更改.

但是,一次运行也不可能吗?

我尝试了但是没有设法提出一些东西,我提出的最好的东西是外观:

re.sub(r'(^|(?<=\t))\t', '  ', a, flags=re.MULTILINE)
Run Code Online (Sandbox Code Playgroud)

哪个"仅"使一个错误的替换(第二个选项卡在f和之间g).

现在可能是因为已经更换的部件无法再次匹配(或者更换不会立即发生),因此在单次运行中完全无法进行正则表达式,并且您无法对"计数"进行排序正则表达式,在这种情况下,我希望看到一些更详细的解释原因(只要这不会过多地转移到[cs.se]领域).

我目前正在使用Python,但这可以应用于几乎任何类似的正则表达式实现.

Wik*_*żew 8

您可以匹配行开头的选项卡,并使用lambda里面re.sub替换为double空格乘以匹配的长度:

import re
s = "a\n\tb\n\t\tc\n\td\te\nf\t\tg";
print(re.sub(r"^\t+", lambda m: "  "*len(m.group()), s, flags=re.M))
Run Code Online (Sandbox Code Playgroud)

请参阅Python演示