Замена подстроки строки на Python
Я хотел бы получить несколько мнений о том, как заменить подстроку строки другим текстом. Вот пример:
У меня есть строка, а, которая может быть чем-то вроде "Привет, мое имя - это имя". У меня также есть другая строка, 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
Вот наиболее распространенные способы сделать это:
>>> 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.
процентный стиль будет знаком многим людям, поступающим с других языков программирования. Некоторые люди считают, что этот стиль подвержен ошибкам из-за конечных "s" в %(name)s
, потому что% -оператор имеет тот же приоритет, что и умножение, и потому, что поведение применяемых аргументов зависит от их типа данных (кортежи и dicts получают специальную обработку). Этот стиль поддерживается в Python с самого начала.
стиль фигурной скобки поддерживается только в Python 2.6 или новее. Это самый гибкий стиль (предоставляющий богатый набор управляющих символов и позволяющий объектам реализовывать пользовательские форматирования).
Ответ 2
Существует несколько способов сделать это, тем чаще будет использоваться оборудование, уже предоставленное строками. Это означает использование оператора %
или, еще лучше, нового и рекомендуемого 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
), если замены сложнее.
Ответ 3
На самом деле это уже реализовано в модуле string.Template
.
Ответ 4
Оформить функцию 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"
.
Ответ 5
Вы можете сделать что-то вроде:
"My name is {name}".format(name="Name")
Он поддерживался изначально в python, как вы можете видеть здесь:
http://www.python.org/dev/peps/pep-3101/
Ответ 6
Вы также можете использовать форматирование с%, но .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