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

时间:2012-05-03 17:30:00

标签: python string substring string-interpolation

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

我有一个字符串,a,可能类似于“Hello my name is $ name”。我还有另一个字符串b,我想在其子字符串'$ name'的位置插入字符串a。

我认为如果以某种方式指示可替换变量将是最简单的。我使用了一个美元符号,但它可以是花括号之间的字符串,也可以是你觉得效果最好的字符串。

解决方案: 以下是我决定这样做的方法:

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')

6 个答案:

答案 0 :(得分:55)

以下是最常用的方法:

>>> 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”,因为%-operator具有与乘法相同的优先级,并且因为应用参数的行为取决于它们的数据类型(元组和dicts得到特殊处理)。从一开始就在Python中支持这种风格。

仅在Python 2.6或更高版本中支持curly-bracket style。它是最灵活的样式(提供丰富的控制字符集,允许对象实现自定义格式化程序)。

答案 1 :(得分: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模块)。

答案 2 :(得分:9)

在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 :(得分:8)

实际上这已经在模块string.Template中实现。

答案 4 :(得分:5)

您可以执行以下操作:

"My name is {name}".format(name="Name")

在python中本地支持它,你可以在这里看到:

http://www.python.org/dev/peps/pep-3101/

答案 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