Подтвердить что ты не робот

Форматирование строки 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
4b9b3361

Ответ 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% продажа сегодня

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