如何去除Python多行字符串的额外缩进?
我有一个Python编辑器,用户在里面输入脚本或代码,这些代码会被放到一个主方法里,同时每一行都会自动缩进。问题是,如果用户输入了多行字符串,整个脚本的缩进会影响到这个字符串,导致每一行前面都多了一个制表符。比如说,一个有问题的脚本可能就这么简单:
"""foo
bar
foo2"""
所以在主方法里看起来会是这样的:
def main():
"""foo
bar
foo2"""
这样一来,字符串的每一行开头都会多一个制表符。
10 个回答
77
根据我的观察,这里一个更好的答案可能是 inspect.cleandoc
,它做的事情和 textwrap.dedent
很相似,但同时也解决了 textwrap.dedent
在处理首行时的一些问题。
下面的例子展示了它们之间的不同:
>>> import textwrap
>>> import inspect
>>> x = """foo bar
baz
foobar
foobaz
"""
>>> inspect.cleandoc(x)
'foo bar\nbaz\nfoobar\nfoobaz'
>>> textwrap.dedent(x)
'foo bar\n baz\n foobar\n foobaz\n'
>>> y = """
... foo
... bar
... """
>>> inspect.cleandoc(y)
'foo\nbar'
>>> textwrap.dedent(y)
'\nfoo\nbar\n'
>>> z = """\tfoo
bar\tbaz
"""
>>> inspect.cleandoc(z)
'foo\nbar baz'
>>> textwrap.dedent(z)
'\tfoo\nbar\tbaz\n'
需要注意的是,inspect.cleandoc
还会把内部的制表符转换为空格。这在某些情况下可能不太合适,但对我来说是没问题的。
165
标准库中的textwrap.dedent功能可以自动去掉那些奇怪的缩进。
-15
所以如果我理解得没错的话,你就是把用户输入的内容拿过来,给它加上合适的缩进,然后把它放到你程序的其他部分(然后运行整个程序)。
在你把用户输入的内容放进程序后,你可以运行一个正则表达式,基本上就是把那些强制缩进的部分去掉。比如说:在三个引号之间,把所有的“换行符”后面跟着四个空格(或者一个制表符)替换成只有一个“换行符”。