23

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

我有一个字符串 a,它可能类似于“你好,我的名字是 $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')
4

6 回答 6

56

以下是最常见的方法:

>>> 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 中可用。

来自其他编程语言的许多人都会熟悉百分比样式。有些人发现这种风格很容易出错%(name)s,因为 % 运算符与乘法具有相同的优先级,并且应用参数的行为取决于它们的数据类型(元组和字典变得特殊)处理)。Python 从一开始就支持这种风格。

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

于 2012-05-03T17:56:37.777 回答
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

于 2012-05-03T17:45:33.300 回答
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"

于 2012-05-03T17:37:07.833 回答
8

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

于 2012-05-03T17:31:43.400 回答
5

您可以执行以下操作:

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

它在 python 中被原生支持,你可以在这里看到:

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

于 2012-05-03T17:35:34.930 回答
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
于 2012-05-03T17:59:11.083 回答