《Python Cookbook(第2版)中文版》——1.14 改变多行文本字符串的缩进

简介:

本节书摘来自异步社区《Python Cookbook(第2版)中文版》一书中的第1章,第1.14节,作者[美]Alex Martelli , Anna Martelli Ravenscrof , David Ascher ,高铁军 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.14 改变多行文本字符串的缩进

任务

有个包含多行文本的字符串,需要创建该字符串的一个拷贝,并在每行行首添加或者删除一些空格,以保证每行的缩进都是指定数目的空格数。

解决方案

字符串对象已经提供了趁手的工具,我们只需写个简单的函数即可满足需求:

def reindent(s, numSpaces):
      leading_space = numSpaces * ' '
      lines = [ leading_space + line.strip( )
                      for line in s.splitlines( ) ]
      return '\n'.join(lines)

讨论

处理文本的时候,我们常常需要改变一块文本的缩进。“解决方案”给出的代码,在多行文本的每行行首增减了空格,这样每行开头都有相同的空格数。比如:

>>> x = """  line one
...     line two
...  and line three
... """
>>> print x
  line one
    line two
 and line three
>>> print reindent(x, 4)
    line one
    line two
    and line three

即使每行的缩进都截然不同,该函数仍能够使它们的缩进变得完全一致,这有时正是我们所需要的,但有时却不是。一个常见的需求是,调整每行行首的空格数,并确保整块文本的行之间的相对缩进不发生变化。无论是正向还是反向调整,这都不是难事。不过,反向调整需要检查一下每行行首的空格,以确保不会把非空格字符截去。因此,我们需要将这个任务分解,用两个函数来完成转化,再加上一个计算每行行首空格并返回一个列表的函数:

def addSpaces(s, numAdd):
      white = " "*numAdd
      return white + white.join(s.splitlines(True))
def numSpaces(s):
      return [len(line)-len(line.lstrip( )) for line in s.splitlines( )]
def delSpaces(s, numDel):
     if numDel > min(numSpaces(s)):
            raise ValueError, "removing more spaces than there are!"
     return '\n'.join([ line[numDel:] for line in s.splitlines( ) ])

所有这些函数都依赖字符串的方法splitlines,它和根据’n’来切分的split很相似。不过splitlines还有额外的好处,它保留了每行末尾的换行符(当你传入的参数是True的时候)。有时这非常方便:如果splitlines这个字符串方法没有提供这个能力,addSpaces不可能这么短小精悍。

然后,我们用这些函数组合成另一个函数来删除行首空格。该函数可以在保持各行之间的相对缩进不变的情况下,只删除它能够删除的空格,让缩进最小的行与左端边界平齐。

def unIndentBlock(s):
      return delSpaces(s, min(numSpaces(s)))

更多资料

Library Reference和Python in a Nutshell中关于序列类型的部分。

相关文章
|
22天前
|
Python
在 Python 中,如何将日期时间类型转换为字符串?
在 Python 中,如何将日期时间类型转换为字符串?
119 64
|
14天前
|
存储 测试技术 Python
Python 中别再用 ‘+‘ 拼接字符串了!
通过选择合适的字符串拼接方法,可以显著提升 Python 代码的效率和可读性。在实际开发中,根据具体需求和场景选择最佳的方法,避免不必要的性能损失。
38 5
|
18天前
|
Python
使用Python计算字符串的SHA-256散列值
使用Python计算字符串的SHA-256散列值
24 7
|
24天前
|
Python
在 Python 中,如何将字符串中的日期格式转换为日期时间类型?
在 Python 中,如何将字符串中的日期格式转换为日期时间类型?
32 6
|
29天前
|
开发工具 Python
[oeasy]python043_自己制作的ascii码表_循环语句_条件语句_缩进_indent
本文介绍了如何使用Python制作ASCII码表,回顾了上一次课程中`print`函数的`end`参数,并通过循环和条件语句实现每8个字符换行的功能。通过调整代码中的缩进,实现了正确的输出格式。最后展示了制作完成的ASCII码表,并预告了下一次课程的内容。
25 2
|
1月前
|
机器学习/深度学习 自然语言处理 API
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程。通过简单的代码示例,展示如何将文本转换为自然流畅的语音,适用于有声阅读、智能客服等场景。
219 3
|
2月前
|
Python
【10月更文挑战第6天】「Mac上学Python 11」基础篇5 - 字符串类型详解
本篇将详细介绍Python中的字符串类型及其常见操作,包括字符串的定义、转义字符的使用、字符串的连接与格式化、字符串的重复和切片、不可变性、编码与解码以及常用内置方法等。通过本篇学习,用户将掌握字符串的操作技巧,并能灵活处理文本数据。
60 1
【10月更文挑战第6天】「Mac上学Python 11」基础篇5 - 字符串类型详解
|
2月前
|
自然语言处理 Java 数据处理
【速收藏】python字符串操作,你会几个?
【速收藏】python字符串操作,你会几个?
61 7
|
2月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
55 2
|
1月前
|
人工智能 开发工具 Python
[oeasy]python040_缩进几个字符好_输出所有键盘字符_循环遍历_indent
本文探讨了Python代码中的缩进问题。通过研究`range`函数和`for`循环,发现缩进对于代码块的执行至关重要。如果缩进不正确,程序会抛出`IndentationError`。文章还介绍了Python的PEP8规范,推荐使用4个空格进行缩进,并通过示例展示了如何使用Tab键实现标准缩进。最后,通过修改代码,输出了从0到122的字符及其对应的ASCII码值,但未能找到竖线符号(`|`)。文章在总结中提到,下次将继续探讨竖线符号的位置。
16 0
下一篇
DataWorks