2016-02-13 3 views
1

Я хотел бы знать количество аргументов, необходимых для данной строки формата. Например, "%s is my name, and %s is my hair color" будет иметь два аргумента. I может найти количество строк % появляется в строке, но это не сработает, если я действительно хочу % в моей строке, и это имело %%, чтобы это обозначить. Это тоже не выглядит элегантно. Есть ли способ лучше?Количество аргументов для форматирования строк

+0

Использование 'str.format' или регулярное выражение является единственным способом –

+1

Как я могу использовать' str.format' найти число нужны аргументы? – zondo

+0

Я имею в виду, что вам нужно будет использовать str.format от get go, чтобы найти заполнители, нет встроенного метода, такого как Formatter.parse, с форматированием старого стиля вам нужно будет самостоятельно его проанализировать –

ответ

2

Самый простой способ, которым я мог придумать это:

+1

@PadraicCunningham: 'ValueError: неполный формат', для вашей более ранней версии. :) Надеюсь, OP только хочет проверить правильные строки формата. –

+0

@PadraicCunningham: Это действительный _string_, но я не вижу, как это действительная строка _format_. Как я уже сказал, я получаю 'ValueError: неполный формат', когда я пытаюсь использовать'% s - это мое имя, а% s - это мой цвет волос %%% "' как строка формата (на Python 2.6.6). –

+0

@ PM2Ring, не должно быть никакого форматирования в строке 'my_string = 100%', и возвращает число 1, вы говорите, что каждая строка должна иметь в нем форматирование? –

-1

Не совсем эффективно - и не совсем серьезно :) ...

for n in xrange(10, -1, -1): 
    try: 
     s % (('',)*n) 
    except TypeError: 
     continue 
    print n 
    break 
+2

Хорошо, -1 для легкомыслия. Служит мне правильно. –

+1

Если это какое-то утешение, я тоже думал о том, чтобы делать что-то подобное, но только для форматов, которые принимают строковые аргументы типа '% s' или'% r', а не числовые форматы, такие как '% d','% f' или '% G'. –

+0

Хорошая точка - использование 0 скорее '' было бы лучше (числа принудительно привязаны к строкам, но не наоборот). –

0

Ну, вы могли бы использовать объект форматтера для этого, поскольку для этого нужна эта функция для собственных целей форматирования. Однако вы должны изменить своих владельцев.

import string 

fmt = string.Formatter() 
my_string = "Hello, {0:s} is my name and {1:s} is my hair color. I have 30% blue eyes" 
parts = fmt.parse(my_string) 
print list(parts) 

Это дает:

[('Hello, ', '0', 's', None), (' is my name and ', '1', 's', None), (' is my hair color. I have 30% blue eyes', None, None, None)] 

Теперь это вопрос фильтрации правые части из, а именно, где третий элемент в каждом кортеже не является None.

Все может быть изменено на однострочник так:

len([p for p in fmt.parse(my_string) if p[2] is not None]) # == 2 
+1

Несомненно, но это фактически не отвечает на вопрос OP, а конкретно о строковых строках в стиле «%» в старом стиле. –

+0

Нигде он не указывает, что он ограничен стильным и нижним строковым форматированием. Он использует его только в этот момент, но нигде он не сказал, что не может его изменить. – avanwieringen

+0

I * хотел бы увидеть подобное решение для форматирования в старом стиле. Правда, я не уточнил; и это * * вводит что-то, о чем я раньше не знал. – zondo

Смежные вопросы