如何去除Python多行字符串的额外缩进?

115 投票
10 回答
54056 浏览
提问于 2025-04-15 14:15

我有一个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

所以如果我理解得没错的话,你就是把用户输入的内容拿过来,给它加上合适的缩进,然后把它放到你程序的其他部分(然后运行整个程序)。

在你把用户输入的内容放进程序后,你可以运行一个正则表达式,基本上就是把那些强制缩进的部分去掉。比如说:在三个引号之间,把所有的“换行符”后面跟着四个空格(或者一个制表符)替换成只有一个“换行符”。

撰写回答