在我的文字中,我想用两个空格替换所有前导选项卡,但不要单独放置非前导选项卡。
例如:
a
\tb
\t\tc
\td\te
f\t\tg
("a\n\tb\n\t\tc\n\td\te\nf\t\tg"
)
应该变成:
a
b
c
d\te
f\t\tg
("a\n b\n c\n d\te\nf\t\tg"
)
就我而言,我可以通过多次替换操作来做到这一点,重复次数是最大嵌套级别的多少倍,或者直到没有任何变化为止。
但是难道一次也不能做到吗?
我尝试过但没有想出办法,但我想出的最好办法是环顾四周:
re.sub(r'(^|(?<=\t))\t', ' ', a, flags=re.MULTILINE)
哪个“仅”错误替换一次(f
和之间的第二个选项卡g
)。
现在可能因为单次运行就不可能在正则表达式中进行操作,因为已经替换的零件无法再次匹配(或者替换不会立即发生),并且您无法在其中进行“计数”正则表达式,在这种情况下,我希望看到一些更详细的解释(为什么(只要这不会过多地移到[cs.se]领域内))。
我目前在Python中工作,但是这几乎可以应用于任何类似的regex实现中。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
您可以在各行的开头匹配制表符,并在内部使用lambdare.sub
替换为双倍空格乘以匹配长度:
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))
参见Python演示
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句