Форматирование строки Python, когда строка содержит «% s» без экранирования

17

При форматировании строки моя строка может содержать modulo "%" , которую я не хочу преобразовывать. Я могу избежать строки и изменить каждый "%" на "%%" в качестве обходного пути.

например,

'Day old bread, 50%% sale %s' % 'today!'  

вывод:

'Day old bread, 50% sale today'

Но есть ли альтернативы побегу? Я надеялся, что использование dict сделает так, чтобы Python игнорировал любые преобразования без ключевых слов.
например,

'Day old bread, 50% sale %(when)s' % {'when': 'today'}  

, но Python по-прежнему видит первый modulo % и дает:

TypeError: not enough arguments for format string
    
задан Stephen Gornick 17.05.2010 в 09:27
источник
  • escaping% не является обходным путем, это документированный и официальный способ сделать это. –  SilentGhost 17.05.2010 в 09:41

4 ответа

22

Вы можете (и должны) использовать новый метод .format() ( если у вас есть Python 2.6 или выше):

"Day old bread, 50% sale {0}".format("today")

Руководство можно найти здесь .

В документах также говорится, что старое форматирование % в конечном итоге будет удалено с языка, хотя это, безусловно, займет некоторое время. Новые методы форматирования более эффективны, так что это хорошая вещь.

    
ответ дан Tim Pietzcker 17.05.2010 в 09:36
источник
  • Если вы не хотите печатать «{{0}} = {0}". format («today»), вам не понравится удваивать фигурные скобки. : ^) –  Mark Tolonen 18.05.2010 в 03:27
  • @MarkTolonen Ugg, я специально пришел сюда, надеясь найти решение проблемы «{{0}}». (...) ... –  KSletmoe 02.08.2013 в 03:13
2

Не очень - побег над вашими знаками% - это цена, которую вы платите за использование форматирования строк. Вместо этого вы можете использовать конкатенацию строк: 'Day old bread, 50% sale ' + whichday , если это помогает ...

    
ответ дан psmears 17.05.2010 в 09:32
источник
  • Для того, где мне нужно поддерживать Python 2.5 или ранее, это метод, который я буду использовать. –  Stephen Gornick 17.05.2010 в 19:23
2

Выход из «%» в качестве «%%» не является обходным путем. Если вы используете форматирование String, это способ представления знака «%». Если вы этого не хотите, вы всегда можете сделать что-то вроде:

print "Day old bread, 50% sale " + "today"

например. не используя форматирование.

Обратите внимание, что при использовании конкатенации строк убедитесь, что переменная является строкой (а не, например, None), или используйте str(varName) . В противном случае вы получите что-то вроде «Невозможно объединить str и NoneType».

    
ответ дан extraneon 17.05.2010 в 09:35
источник
2

Вы можете использовать регулярные выражения для замены% на %%, где% не сопровождается (

def format_with_dict(str, dictionary):
    str = re.sub(r"%([^\(])", r"%%", str)
    str = re.sub(r"%$", r"%%", str)  # There was a % at the end?
    return str % dictionary

Таким образом:

print format_with_dict('Day old bread, 50% sale %(when)s', {'when': 'today'})

Будет выводиться:

  

День старый хлеб, 50% продажа сегодня

Этот метод полезен, чтобы избежать «недостаточно аргументов для ошибок строки формата».

    
ответ дан cfillol 23.04.2014 в 17:32
источник