Замена подстроки в строке в Python

Я хотел бы получить несколько мнений о том, как лучше всего заменить подстроку строки другим текстом. Вот пример:

У меня есть строка, a, которая может быть чем-то вроде "Привет, меня зовут $name". У меня также есть другая строка, b, которую я хочу вставить в строку a вместо ее подстроки "$name".

Я предполагаю, что было бы проще, если сменная переменная будет указана каким-то образом. Я использовал знак доллара, но это может быть строка между curly брекеты или что вы чувствуете, будет работать лучше.

устранение: Вот как я решил это сделать:

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

6 ответов


вот наиболее распространенные способы сделать это:

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

подход с использованием строку.Шаблон легко учиться и должны быть знакомы с пользователями bash. Соответствующе для подвергать действию к пользователям. Этот стиль стал доступен в Python 2.4.

на процентов-стиль будет знаком многим людям, пришедшим из других языков программирования. Некоторые люди считают, что этот стиль подвержен ошибкам из-за трейлинга "s" в %(name)s, потому что %- оператор имеет тот же приоритет, что и умножение, и поскольку поведение применяемых аргументов зависит от их типа данных (кортежи и дикты получают специальную обработку). Этот стиль поддерживается в Python с самого начала.

на фигурная скобка стиль поддерживается только в Python 2.6 или более поздней версии. Это самый гибкий стиль (обеспечивающий богатый набор управляющих символов и позволяющий объектам реализовывать пользовательские форматеры).


есть несколько способов сделать это, более часто используемые будут через средства, уже предоставленные строками. Это означает использование % оператор, или еще лучше, более новый и рекомендуемый 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 module) если замены более сложны.


на самом деле это уже реализовано в модуле string.Template.


проверка функции replace () в python. Вот ссылка:

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".


вы можете сделать что-то вроде:

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

он поддерживается изначально в python, как вы можете видеть здесь:

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


вы также можете использовать форматирование с % но .формат () считается более современным.

>>> "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