2016-11-18 9 views
2

Есть ли способ заменить только первый аргумент только форматированием строк? Как и в этом:В форматировании строк я могу заменить только один аргумент за раз?

"My quest is {test}{}".format(test="test") 

Я хочу выход быть:

"My quest is test {} 

Второй {} агд я заменю позже.

Я знаю, что может создать строку, как:

"My quest is {test}".format(test="test") 

, а затем объединить его с оставшейся строкой и создать новую строку, но я могу сделать это за один раз?

+0

Можете ли вы дать более ясный пример, чтобы продемонстрировать, что вы хотите? Ваш вопрос непонятен. –

ответ

3

Если вы знаете, когда вы настраиваете формат строка, вы будете заменять только подмножество значений, и вы хотите какой-либо другой набор, чтобы остаться, вы можете избежать те, что вы не собираетесь заполнить сразу удвоив скобки:

x = "foo {test} bar {{other}}".format(test="test") # other won't be filled in here 
print(x)        # prints "foo test bar {other}" 
print(x.format(other="whatever"))  # prints "foo test bar whatever" 
1

Единственный способ заменить его в той же строке, если вы замените "{test}" на другую скобку. То есть:

s = "My quest is {test}".format(test="test {}").format('testing') 

, но это не имеет особого смысла, потому что вы могли бы просто сделать:

s = "My quest is {test} {}".format('testing', test="test {}") 

немедленно.

Вы можете сохранить результат:

s = "My quest is {test}".format(test="test {}") 

Так s имеет кронштейн внутри он ждет, чтобы заменить и вызвать format на нем позже, если вам нужно.

1

Вам нужно написать собственную функцию формата, которая производит только одну замену. Например, чтобы дать вам то, чтобы начать с (обратите внимание, что это несколько уязвимы для плохих строк формата):

import re 
def formatOne(s, arg): 
    return re.sub('\{.*?\}', arg, s, count=1) 

Используется так:

>>> s = "My quest is {test}{}" 
>>> formatOne(s, 'test') 
'My quest is test{}' 
>>> formatOne(_, ' later') 
'My quest is test later' 
0

кор Прямоугольник путь для достижения этой цели, вероятно, будет подкласс string.Formatter класса и использовать его экземпляр вместо метода строки:

from string import Formatter 
class IncrementalFormatter(Formatter): 
    pass # your implementation 
f = IncrementalFormatter() 
f.format("hello {name}", name="Tom") 

Следующих Formatter методов должны были бы быть перезаписаны:

  1. get_value() должен возвращать некоторые специальный объект вместо повышения LookupError.
  2. get_field() должен сохранить аргумент field_name в этот объект (или продолжать нормально, если объект не является нашим специальным объектом).
  3. convert_field() должен просто сохранить аргумент conversion в этот объект и не преобразовывать (или продолжать нормально ...).
  4. format_field() должен восстановить строку формата поля из специального объекта, используя его атрибуты field_name и conversion и аргумент format_spec этого метода (или продолжить нормально ...).

Так, например:

f.format("{greet} {who.name!r:^16s}", greet="hello") 

должно привести к "hello {who.name!r:^16s}", где "who.name" является field_name, "r" является conversion, "^16s" является format_spec и все эти три значения были вновь объединены обратно в "{who.name!r:^16s}", так что его можно использовать в следующем проходе форматирования.

Дополнительный примечание: специальный объект должен возвращаться при доступе к любому атрибуту (с .) или изделием (с []).