--- fid: 20240729-220109 tags: white space, string, indent, dedent --- (20240729-220109)= # 多行字符串缩进与空格处理 2024-07-29,Kimi **难度**: 2 **时长**: 30 min ## 问题 python 多行字符串模板换行缩进空格问题有哪些解决方法? 在Python中,如果你想在函数内部定义一个多行字符串模板,并希望在定义时它带有缩进的空格以保持代码美观,但在生成结果时没有左边的空格,可以使用以下方法: ```python def generate_template(): template = r""" 这是第一行。 这是第二行。 """ return template.strip() result = generate_template() print(result) ``` 上面的代码得不到正确的结果,即因为空格的影响没有左对齐: ```console 这是第一行。 这是第二行。 ``` `textwrap.dedent(template)` ## Solutions ### 使用正则表达式 使用正则表达式来移除字符串开头的空格。 ```python import re def generate_template(): template = """ 这是第一行。 这是第二行。 """ # 使用正则表达式移除每行开头的空格 return re.sub(r'^\s+', '', template, flags=re.MULTILINE).strip() result = generate_template() print(result) ``` ### `str.splitlines()`+ `join()` 将多行字符串分割成行,然后重新拼接,去掉每行的开头空格。 除了 `split()` 函数,这个 `splitlines()` 是按行分割。去除首尾空格(白)还是靠的 `strip()` ```python def generate_template(): template = """ 这是第一行。 这是第二行。 """ lines = template.splitlines() return '\n'.join(line.strip() for line in lines) result = generate_template() print(result) ``` ### `textwrap.dedent()` `textwrap.dedent`函数可以移除字符串开头的空格,使其与定义时的缩进对齐。 ```python import textwrap def generate_template(): template = """ 这是第一行。 这是第二行。 """ return textwrap.dedent(template).strip() result = generate_template() print(result) ``` 这些方法都可以实现在函数内部定义多行字符串模板时保持代码美观,同时在生成结果时去除左边的空格。你可以根据自己的需求选择最适合的方法。 ## 模板中的空格缩进 如果模板中的字符串不是要求左对齐,而是有指定的缩进,则又要如何处理? ```python def generate_template(): template = """ 这是第一段。 这是第二段。 """ pass ```