Форматирование строки Python, когда строка содержит "% s" без экранирования - PullRequest
17 голосов
/ 17 мая 2010

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

например,

'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 по-прежнему видит первый модуль % и выдает:

TypeError: not enough arguments for format string

Ответы [ 4 ]

24 голосов
/ 17 мая 2010

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

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

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

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

2 голосов
/ 23 апреля 2014

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

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% сегодня

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

2 голосов
/ 17 мая 2010

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

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

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

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

2 голосов
/ 17 мая 2010

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

...