使用Python替换字符串中的子字符串

24

我想获得一些关于替换字符串子串为其他文本的最佳方法的意见。这是一个例子:

我有一个字符串a,它可能是类似于“Hello my name is $name”的内容。我还有另一个字符串b,我想将其插入到字符串a中代替其子串“$name”的位置。

我假设如果可替换变量以某种方式表示,那么这将是最容易的。我使用了美元符号,但也可以是大括号之间的字符串或您认为最好的任何内容。

解决方案: 我是这样做的:

from string import Template


message = 'You replied to $percentageReplied of your message. ' + 
    'You earned $moneyMade.'

template = Template(message)

print template.safe_substitute(
    percentageReplied = '15%',
    moneyMade = '$20')

1
如果$格式的替代物不是不可更改的,我想请您重新考虑使用标准格式方法{}。 - Tony Veijalainen
6个回答

57
以下是最常见的方法:
>>> import string
>>> t = string.Template("Hello my name is $name")
>>> print t.substitute(name='Guido')
Hello my name is Guido

>>> t = "Hello my name is %(name)s"
>>> print t % dict(name='Tim')
Hello my name is Tim

>>> t = "Hello my name is {name}"
>>> print t.format(name='Barry')
Hello my name is Barry

使用 string.Template 的方法易于学习,并且对于 bash 用户而言应该很熟悉。它适合向最终用户公开。这种风格从 Python 2.4 开始可用。 percent-style 对于许多来自其他编程语言的人来说是熟悉的。一些人认为这种风格容易出错,因为 %(name)s 中有一个尾随的 "s",因为 %-运算符具有与乘法相同的优先级,并且应用的参数的行为取决于它们的数据类型(元组和字典获得特殊处理)。这种风格自 Python 开始就得到支持。 curly-bracket style 仅在 Python 2.6 或更高版本中受支持。它是最灵活的风格(提供了丰富的控制字符,并允许对象实现自定义格式化程序)。

16
我很确定 Raymond 暗示的是 Python 的创建者和 BDFL (终身仁慈独裁者) Guido van Rossum、著名的 TimSort 发明人 Tim Peters (编写了《Python 之禅》) 以及 Python/Jython 中重要人物 Barry Warsaw (例如在这个愚人节玩笑中,Barry Warsaw 成为了 FLUFL (友好的语言叔叔终身称号))。 - dr jimbob

11

请查看Python中的replace()函数。这是一个链接:

http://www.tutorialspoint.com/python/string_replace.htm

当你想要替换一些特定文本时,这应该会很有用。例如,在链接中他们向你展示了以下内容:

str = "this is string example....wow!!! this is really string"
print str.replace("is", "was")

将每个单词"is"替换为"was"


3
这实际上是为什么str.replace不是OP想要的一个很好的例子:“this”会变成“thwas” :) - merwok

11

有很多方法可以实现,更常用的方法是利用字符串已经提供的功能。这意味着使用%运算符或者更好的、新推荐的str.format()

例如:

a = "Hello my name is {name}"
result = a.format(name=b)

更简单地说

result = "Hello my name is {name}".format(name=b)

您还可以使用位置参数:

result = "Hello my name is {}, says {}".format(name, speaker)

或者使用显式索引:

result = "Hello my name is {0}, says {1}".format(name, speaker)

它允许您在不改变对format()的调用的情况下更改字符串中字段的顺序:

result = "{1} says: 'Hello my name is {0}'".format(name, speaker)

格式化非常强大。你可以使用它来决定一个字段的宽度,如何编写数字以及其他类似的格式设置,具体取决于你在方括号内编写的内容。

如果替换更为复杂,你也可以使用 str.replace() 函数或正则表达式(来自 re 模块)。


8

5

2

您也可以使用%进行格式化,但.format()被认为更加现代化。

>>> "Your name is %(name)s. age: %(age)i" % {'name' : 'tom', 'age': 3}
'Your name is tom'

但它也支持一些类型检查,就像通常的%格式化一样:

>>> '%(x)i' % {'x': 'string'}

Traceback (most recent call last):
  File "<pyshell#40>", line 1, in <module>
    '%(x)i' % {'x': 'string'}
TypeError: %d format: a number is required, not str

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接