《Python Cookbook(第2版)中文版》——1.16 替换字符串中的子串

简介:

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

1.16 替换字符串中的子串

任务

需要一个简单的方法来完成这样一个任务:给定一个字符串,通过查询一个替换字典,将字符串中被标记的子字符串替换掉。

解决方案

下面给出的解决办法既适用于Python 2.3,也适用于2.4:

def expand(format, d, marker='"', safe=False):
      if safe:
             def lookup(w): return d.get(w, w.join(marker*2))
      else:
             def lookup(w): return d[w]
      parts = format.split(marker)
      parts[1::2] = map(lookup, parts[1::2])
      return ''.join(parts)
if _ _name_ _ == '_ _main_ _':
      print expand('just "a" test', {'a': 'one'})
# 输出:just one test

如果参数safe是False,则默认条件下,字符串中所有被标记的子字符串必须能够在字典d中找到,否则,expand会抛出一个KeyError异常并终止执行。当参数safe被明确指定为True时,如果被标记的子字符串在字典中找不到,则被标记的部分也不会被改变。

讨论

expand函数代码的主体部分有个很有趣的地方:根据操作是否被要求为安全,它使用两个不同的嵌套函数(两者有着同样的名字lookup)中的一个。安全意味着被标记的子字符串应该能够在字典查到,如果查不到,不抛出KeyError异常。如果这个函数并不是必须安全的(默认情况下不安全),lookup根据索引访问字典d,并在该索引(子字符串)不存在的时候抛出个错误。但如果lookup被要求为安全的,它将使用d的方法get,get返回根据索引能够查到的值,若找不到就返回在两边加上了标记的被查询的子字符串。给safe传入True,表明你宁可看到输出中有标记符也不愿看到异常信息。marker+w+marker是可以替换w.join(marker*2)的另一种方式,但我采用后者的原因是,它展示了一种不太简明却很有意思的构造带引号字符串的方法。

不管用哪个版本的lookup,expand都会执行切分、修改、拼接—这些在Python的字符串处理中最重要的操作。在expand中进行修改的部分,使用了指定了步长的列表切片方法。确切地说,expand访问并重新绑定了parts的奇数索引的项,因为这些项正好是原字符串中位于两个标记符之间的部分。因此,它们就是被标记的子字符串,也就是需要在字典中查找的字符串。

本节解决方案给出的expand函数接受非常灵活的字符串语法形式,比基于$的string.Template更灵活。你如果想让输出字符串包括双引号,也可以指定其他的标记符。当然,函数也没有限制被标记的子串不能是标识符,可以轻松地插入Python表达式(d的 _getitem _方法会执行eval操作)或者任意其他占位符。而且,还可以轻易地搞出点有些不同的更有趣的效果,比如:

print expand('just "a" ""little"" test', {'a' : 'one', '' : '"'})

输出结果是just one "little" test。高级用户可以定制Python 2.4的string.Template类,通过继承来实现上述的所有功能,甚至更多其他高级功能。但本节解决方案中的小巧的expand函数却更加简洁易用。

相关文章
|
1月前
|
存储 人工智能 Python
[oeasy]python061_如何接收输入_input函数_字符串_str_容器_ 输入输出
本文介绍了Python中如何使用`input()`函数接收用户输入。`input()`函数可以从标准输入流获取字符串,并将其赋值给变量。通过键盘输入的值可以实时赋予变量,实现动态输入。为了更好地理解其用法,文中通过实例演示了如何接收用户输入并存储在变量中,还介绍了`input()`函数的参数`prompt`,用于提供输入提示信息。最后总结了`input()`函数的核心功能及其应用场景。更多内容可参考蓝桥、GitHub和Gitee上的相关教程。
16 0
|
2月前
|
存储 测试技术 Python
Python 中别再用 ‘+‘ 拼接字符串了!
通过选择合适的字符串拼接方法,可以显著提升 Python 代码的效率和可读性。在实际开发中,根据具体需求和场景选择最佳的方法,避免不必要的性能损失。
62 5
|
2月前
|
Python
使用Python计算字符串的SHA-256散列值
使用Python计算字符串的SHA-256散列值
74 7
|
3月前
|
Python
在 Python 中,如何将日期时间类型转换为字符串?
在 Python 中,如何将日期时间类型转换为字符串?
149 64
|
3月前
|
Python
在 Python 中,如何将字符串中的日期格式转换为日期时间类型?
在 Python 中,如何将字符串中的日期格式转换为日期时间类型?
63 6
|
4月前
|
自然语言处理 Java 数据处理
【速收藏】python字符串操作,你会几个?
【速收藏】python字符串操作,你会几个?
94 7
|
4月前
|
Python
【10月更文挑战第6天】「Mac上学Python 11」基础篇5 - 字符串类型详解
本篇将详细介绍Python中的字符串类型及其常见操作,包括字符串的定义、转义字符的使用、字符串的连接与格式化、字符串的重复和切片、不可变性、编码与解码以及常用内置方法等。通过本篇学习,用户将掌握字符串的操作技巧,并能灵活处理文本数据。
71 1
【10月更文挑战第6天】「Mac上学Python 11」基础篇5 - 字符串类型详解
|
4月前
|
存储 安全 Serverless
Python学习四:流程控制语句(if-else、while、for),高级数据类型(字符串、列表、元组、字典)的操作
这篇文章主要介绍了Python中的流程控制语句(包括if-else、while、for循环)和高级数据类型(字符串、列表、元组、字典)的操作。
67 0
|
4月前
|
Python
Python操作:字符串--列表--元组--字典--运算符 (一)
Python操作:字符串--列表--元组--字典--运算符 (一)
30 0
|
4月前
|
Python
Python操作:字符串--列表--元组--字典--运算符 (二)
Python操作:字符串--列表--元组--字典--运算符 (二)
36 0

热门文章

最新文章

推荐镜像

更多