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

kwi*_*ess 22 python string substring string-interpolation

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

我有一个字符串,a,可能是"你好我的名字是$ 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')
Run Code Online (Sandbox Code Playgroud)

Ray*_*ger 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
Run Code Online (Sandbox Code Playgroud)

使用string.Template的方法很容易学习,并且对bash用户应该很熟悉.它适合暴露给最终用户.这种风格在Python 2.4中可用.

百分比风格将是熟悉的很多人从其他编程语言的到来.有些人发现这种风格容易出错,因为尾随"s" %(name)s,因为%-operator具有与乘法相同的优先级,并且因为应用参数的行为取决于它们的数据类型(元组和dicts变得特殊)处理).Python从一开始就支持这种风格.

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

  • @kwikness - 我很确定雷蒙德暗指[Guido van Rossum](http://en.wikipedia.org/wiki/Guido_van_Rossum)(蟒蛇的创造者和BDFL(终身仁慈的独裁者)),Tim Peters([TimSort] ](http://en.wikipedia.org/wiki/Timsort)成名,写道[Python的禅宗](http://stackoverflow.com/questions/228181/the-zen-of-python))和[Barry]华沙](http://barry.warsaw.us/)(在python/jython中很重要 - 例如,在这个[愚人节玩笑]中(http://www.python.org/dev/peps/pep-0401/)巴里叔叔成为了FLUFL(终身友好的语言叔叔). (16认同)

Qua*_*ega 11

有很多方法可以做到这一点,通常使用的是通过字符串提供的设施.这意味着使用%操作员,或者更好,更新和推荐str.format().

例:

a = "Hello my name is {name}"
result = a.format(name=b)
Run Code Online (Sandbox Code Playgroud)

或者更简单

result = "Hello my name is {name}".format(name=b)
Run Code Online (Sandbox Code Playgroud)

您还可以使用位置参数:

result = "Hello my name is {}, says {}".format(name, speaker)
Run Code Online (Sandbox Code Playgroud)

或者使用显式索引:

result = "Hello my name is {0}, says {1}".format(name, speaker)
Run Code Online (Sandbox Code Playgroud)

这允许您更改字符串中字段的顺序,而无需将调用更改为format():

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

格式非常强大.您可以使用它来决定制作字段的宽度,如何编写数字以及排序的其他格式,具体取决于您在括号内写的内容.

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


fil*_*mor 8

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


tab*_*has 8

在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")
Run Code Online (Sandbox Code Playgroud)

对于每个单词"is",它将用单词替换它"was".

  • 这实际上是一个很好的例子,说明str.replace为什么*不是OP想要的东西:"这个"将成为"thwas":)(请不要用分号谢谢) (3认同)

pca*_*cao 5

你可以这样做:

"My name is {name}".format(name="Name")
Run Code Online (Sandbox Code Playgroud)

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

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