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

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函数却更加简洁易用。

时间: 2024-10-02 19:18:32

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

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

1.17 替换字符串中的子串-Python 2.4 任务 在Python 2.4的环境下,你想完成这样的任务:给定一个字符串,通过查询一个字符串替换字典,将字符串中被标记的子字符串替换掉. 解决方案 Python 2.4提供了一个新的string.Template类,可以应用于这个任务.下面给出一段代码以展示怎样使用这个类: import string # 从字符串生成模板,其中标识符被$标记 new_style = string.Template('this is $thing') # 给模板

求大神解答一下-C++ primer plus 第6版 中文版 第16章复习题的一个问题

问题描述 C++ primer plus 第6版 中文版 第16章复习题的一个问题 奇葩的是课后居然没答案...... 求正规.严谨.简洁的标准答案! 程序清单16.15(在p708页):functor.cpp //functor.cpp--using a functor #include尖括号iostream尖括号 #include尖括号list尖括号 #include尖括号iterator尖括号 #include尖括号algorithm尖括号 template//functor class

Python字符串中查找子串小技巧_python

惭愧啊,今天写了个查找子串的Python程序被BS了- 如果让你写一个程序检查字符串s2中是不是包含有s1.也许你会很直观的写下下面的代码: 复制代码 代码如下: #determine whether s1 is a substring of s2 def isSubstring1(s1,s2):     tag = False     len1 = len(s1)     len2 = len(s2)     for i in range(0,len2):         if s2[i] =

《像计算机科学家一样思考Python(第2版)》——2.6 字符串操作

2.6 字符串操作 通常来说,字符串不能进行数学操作.即使看起来像数字也不行.下面的操作是非法的: '2' - '1' 'eggs'/'easy' 'third'*'a charm' 但有两个例外:+和*. 操作符+进行字符串拼接(string concatenation)操作,意即将前后两个字符首尾连接起来.例如: >>> first = 'throat' >>> second = 'warbler' >>> first + second throa

《Python Cookbook(第2版)中文版》——导读

前 言 这本书不是一本典型的O'Reilly风格的书,而是一本集合了多个作者的手稿的作品.实际上,这也是一种将开源开发的方式应用到书籍出版业的尝试.Python社区有超过300个成员在本书中贡献了他们的心得和资料.在这里,我们作为编辑,想给你--本书的读者,介绍一些重要的背景资料,这些背景资料是关于此书是如何编著出来,以及这个过程和涉及的人,并提出一些关于这种崭新的风格的思考. 目 录 [第1章 文本1.1 每次处理一个字符](https://yq.aliyun.com/articles/963

python统计字符串中指定字符出现次数的方法_python

本文实例讲述了python统计字符串中指定字符出现次数的方法.分享给大家供大家参考.具体如下: python统计字符串中指定字符出现的次数,例如想统计字符串中空格的数量 s = "Count, the number of spaces." print s.count(" ") x = "I like to program in Python" print x.count("i") PS:本站还提供了一个关于字符统计的工具,感兴

《Python Cookbook(第2版)中文版》——1.15 扩展和压缩制表符

1.15 扩展和压缩制表符 任务 将字符串中的制表符转化成一定数目的空格,或者反其道而行之. 解决方案 将制表符转换为一定数目的空格是一种很常见的需求,用Python的字符串提供的expandtabs方法可以轻松解决问题.由于字符串不能被改变,这个方法返回的是一个新的字符串对象,是原字符串的一个修改过的拷贝.不过,仍可以将修改过的拷贝绑定到原字符串的名字: mystring = mystring.expandtabs( ) 这样并不会改变mystring原先指向的字符串对象,只不过将名字myst

《Python Cookbook(第3版)中文版》——6.2 读写JSON数据

6.2 读写JSON数据 6.2.1 问题 我们想读写以JSON(JavaScript Object Notation)格式编码的数据. 6.2.2 解决方案 json模块中提供了一种简单的方法来编码和解码JSON格式的数据.这两个主要的函数就是json.dumps()以及json.loads().这两个函数在命名上借鉴了其他序列化处理库的接口,比如pickle.下面的示例展示了如何将Python数据结构转换为JSON: import json data = { 'name' : 'ACME',

《Python Cookbook(第2版)中文版》——第1章 文本 1.1 每次处理一个字符

第1章 文本 引言 感谢:Fred L. Drake, Jr.,PythonLabs 对于脚本语言来说,文本处理任务构成了一个重要的组成部分,每个人都会同意文本处理非常有用.每个人都会有一些文本需要重新格式化或者转化为另一种形式.问题是,每个程序都与另一个程序有点不同,无论它们是多么相似,想提取出一些可复用的代码片段并用它来处理不同的文件格式仍然是非常困难的. 什么是文本 看起来问题有点简单得过分了,事实上,我们看到了文本,就知道了什么是文本,文本是一串字符,这正是它与二进制数据之间的不同.二进