2016-02-13 97 views
1

数我想知道对于给定的格式字符串所需参数的个数。例如,"%s is my name, and %s is my hair color"将有两个参数需要。我可以找到的次数%字符串中显示出来,但如果我真的想在我的字符串%,它有%%,以表明这是行不通的。它也看起来并不高雅。有没有更好的办法?参数字符串格式设置

+0

使用'str.format'或正则表达式是我怎么能使用'str.format'找到的数量的唯一途径 –

+1

需要参数? – zondo

+0

我的意思是,你将不得不使用str.format从一开始去寻找占位符,有喜欢的Formatter.parse没有内置的方法,与旧式的格式,你需要自己解析它 –

回答

2

我能想出的最简单的方法是这样的:

+1

@PadraicCunningham:'ValueError:格式不完整,为您的早期版本。 :)希望OP只想测试有效的格式字符串。 –

+0

@PadraicCunningham:这是一个有效的_string_,但我不明白它是一个有效的_format string_。正如我所说的,当我尝试使用“%s是我的名字,%s是我的头发颜色%%%”作为格式字符串(在Python 2.6.6上)时,我得到了'ValueError:incomplete format'。 –

+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

如果它的任何安慰,我认为做这样的事情太多,除了它仅适用于接受字符串ARGS像'%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)] 

现在是筛选合适的零件出,即凡在每个元组中的第三个项目是不是无的问题。

一切都可以改变一个班轮这样的:

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

当然,但这并没有真正回答OP的问题,这个问题特别针对基于旧式''''格式的字符串。 –

+0

他没有指明他与旧式和低级字符串格式相关。他现在只使用它,但没有说它不能改变它。 – avanwieringen

+0

我*希望看到旧式格式的类似解决方案。不过,我确实没有说明;而这*确实*介绍了我以前不知道的东西。 – zondo