Форматирование строки Python, когда строка содержит "% s" без экранирования
При форматировании строки моя строка может содержать 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
Ответы
Ответ 1
Вы могли бы (и должны) использовать новую строку .format()
метод (если у вас есть Python 2.6 или выше):
"Day old bread, 50% sale {0}".format("today")
Руководство можно найти здесь.
В документах также говорится, что старое форматирование %
в конечном итоге будет удалено с языка, хотя это, безусловно, займет некоторое время. Новые методы форматирования более эффективны, поэтому хорошая вещь.
Ответ 2
Не очень - побег над вашими знаками% - это цена, которую вы платите за использование форматирования строк. Вместо этого вы можете использовать конкатенацию строк: 'Day old bread, 50% sale ' + whichday
, если это помогает...
Ответ 3
Выход из "%" в качестве "%%" не является обходным путем. Если вы используете форматирование String, это способ представления знака "%". Если вы этого не хотите, вы всегда можете сделать что-то вроде:
print "Day old bread, 50% sale " + "today"
например. не используя форматирование.
Обратите внимание, что при использовании конкатенации строк убедитесь, что переменная является строкой (а не, например, None), или используйте str(varName)
. В противном случае вы получите что-то вроде "Невозможно объединить str и NoneType".
Ответ 4
Вы можете использовать регулярные выражения для замены% на %%, где% не сопровождается (
def format_with_dict(str, dictionary):
str = re.sub(r"%([^\(])", r"%%\1", 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% продажа сегодня
Этот метод полезен, чтобы избежать "недостаточно аргументов для ошибок строки формата".