《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')
# 给模板的substitute方法传入一个字典参数并调用之
print new_style.substitute({'thing':5})       # 输出:this is 5
print new_style.substitute({'thing':'test'}) # 输出:this is test
# 另外,也可以给substitute方法传递关键字参数
print new_style.substitute(thing=5)            # 输出:this is 5
print new_style.substitute(thing='test')      # 输出:this is test

讨论

Python 2.3中,用于标记—替换的字符串格式被写为更加繁琐的形式:

old_style = 'this is %(thing)s'

标识符被放在一对括弧中,括弧前面一个%,后面一个s。然后,还需要使用%操作符,使用的格式是将需要处理的字符串放在%操作符左边并在右边放上字典:

print old_style % {'thing':5}       # emits: this is 5
print old_style % {'thing':'test'} # emits: this is test

当然,这样的代码在Python 2.4中也可以正常工作。不过,新的string.Template提供了一个更简单的替代方法。

当你创建string.Template实例时,在字符串格式中,可以用两个美元符($)来代表$,还可以让那些需要被替换的标识后面直接跟上用于替换的文本或者数字,并用一对花括号({ })将它们括起来。下面是一个例子:

form_letter = '''Dear $customer,
I hope you are having a great time.
If you do not find Room $room to your satisfaction,
let us know. Please accept this $$5 coupon.
                  Sincerely,
                  $manager
                  ${name}Inn'''
letter_template = string.Template(form_letter)
print letter_template.substitute({'name':'Sleepy', 'customer':'Fred Smith',
                                                    'manager':'Barney Mills','room':307,
                                                   })
      上面的代码片段给出下列输出:
Dear Fred Smith,
I hope you are having a great time.
If you do not find Room 307 to your satisfaction,
let us know. Please accept this $5 coupon.
                  Sincerely,
                  Barney Mills
                  SleepyInn

有时,为了给substitute准备一个字典做参数,最简单的方法是设定一些本地变量,然后将所有这些变量交给locals()(此函数将创建一个字典,字典的key就是本地变量,本地变量的值可通过key来访问):

msg = string.Template('the square of $number is $square')
for number in range(10):
      square = number * number
      print msg.substitute(locals( ))

另一个简单的办法是使用关键字参数语法而非字典,直接将值传递给substitute:

msg = string.Template('the square of $number is $square')
for i in range(10):
       print msg.substitute(number=i, square=i*i)

甚至可以同时传递字典和关键字参数:

msg = string.Template('the square of $number is $square')
for number in range(10):
      print msg.substitute(locals( ), square=number*number)

为了防止字典的条目和关键字参数显式传递的值发生冲突,关键字参数优先。比如:

msg = string.Template('an $adj $msg')
adj = 'interesting'
print msg.substitute(locals( ), msg='message')
# emits an interesting message
时间: 2024-09-16 21:34:46

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

《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]

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(第3版)中文版》——导读

前 言 自2008年以来,我们已经目睹了整个Python世界正缓慢向着Python 3进化的事实.众所周知,完全接纳Python 3要花很长的时间.事实上,就在写作本书时(2013年),大多数Python程序员仍然坚持在生产环境中使用Python 2.关于Python 3不能向后兼容的事实也已经做了许多努力来补救.的确,向后兼容性对于任何已经存在的代码库来说是个问题.但是,如果你着眼于未来,你会发现Python 3带来的好处绝非那么简单. 正因为Python 3是着眼于未来的,本书在之前的版本上

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

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

《Python Cookbook(第2版)中文版》——1.13 访问子字符串

1.13 访问子字符串 任务 获取字符串的某个部分.比如,你读取了一条定长的记录,但只想获取这条记录中的某些字段的数据. 解决方案 切片是个好方法,但是它一次只能取得一个字段: afield = theline[3:8] 如果还需考虑字段的长度,struct.unpack可能更适合.比如: import struct # 得到一个5字节的字符串,跳过3字节,得到两个8字节字符串,以及其余部分: baseformat = "5s 3x 8s 8s" # theline超出的长度也由这个b

《Python Cookbook(第2版)中文版》——1.11 检查一个字符串是文本还是二进制

1.11 检查一个字符串是文本还是二进制 任务 在Python中,普通字符串既可以容纳文本,也可以容纳任意的字节,现在需要探知(当然,完全是启发式的试探:对于这个问题并没有什么精准的算法)一个字符串中的数据究竟是文本还是二进制. 解决方案 我们采取Perl的判定方法,如果字符串中包含了空值或者其中有超过30%的字符的高位被置1(意味着该字符的码值大于126)或是奇怪的控制码,我们就认为这段数据是二进制数据.我们得自己编写代码,其优点是对于特殊的程序需求,我们随时可以调整这种启发式的探知方式: f