Python 2.7 计算python格式字符串的预期值数
我有一个方法,它接收用户提供的格式字符串和一组值,并使用它们将输出写入屏幕Python 2.7 计算python格式字符串的预期值数,python-2.7,format,Python 2.7,Format,我有一个方法,它接收用户提供的格式字符串和一组值,并使用它们将输出写入屏幕 def makestring(fmt, vals): s = fmt.format(*vals) return s fmt_expecting_three = 'a={:0.2f}, b={:0.4f}, c={:0.1f}' threevalues = [(x+1)/7. for x in range(3)] makestring(fmt_expecting_three, threevalues)
def makestring(fmt, vals):
s = fmt.format(*vals)
return s
fmt_expecting_three = 'a={:0.2f}, b={:0.4f}, c={:0.1f}'
threevalues = [(x+1)/7. for x in range(3)]
makestring(fmt_expecting_three, threevalues)
产生
'a=0.14, b=0.2857, c=0.4'
我想执行一个测试,以发现值的数量与格式的“预期”匹配
我在下面展示了一个丑陋的测试,如果您没有将maxcheck
设置得足够高,它可能会给出错误的结果。是否有一种更自然、不那么丑陋的方法来确定期望值是多少
def checkit(fmt, maxcheck=None):
if maxcheck == None:
maxcheck = 10
for i in range(maxcheck-1, 0, -1):
try:
fmt.format(*range(i))
except:
return i+1
fmt_expecting_three = 'a={:0.2f}, b={:0.4f}, c={:0.1f}'
checkit(fmt_expecting_three)
返回
3
2 pi={:0.2f}, e={:0.4f}
1 pi={:0.2f}, e={q
1 {{}
1 {}wow
0 wow
1 {}
对于这种情况,我倾向于看Python解释器解决问题的方式,而不是重新发明轮子 我找到了一个名为
countformat()
。(这也是。)
下一步是看看这个函数是公开的,还是严格地说是C。看起来答案是否定的,所以我可能只是复制他们所做的任何事情,而是用Python来做。编写正则表达式可能更有效,但C函数至少让您了解了如何定义正则表达式
一般算法如下:
- 将level设置为0,count设置为0
- 遍历格式字符串。对于每个字符:
- 如果遇到开头格式标记
,(
,[
):{
- 如果级别为0,则递增计数
- 增量级别
- 否则,如果遇到结束格式标记
,)
,]
:}
- 如果级别为0,则递减计数
- 减量水平
- 否则,如果您找到其他标记
,
,&
,:
,
:\t
- 什么也不做
- Else(其他字符):
- 如果级别为0,则递增计数
- 返回计数
3
2 pi={:0.2f}, e={:0.4f}
1 pi={:0.2f}, e={q
1 {{}
1 {}wow
0 wow
1 {}
耶 我愿意和你一起做这件事。这可以确保字符串实际上是一个有效的格式字符串,同时为您提供有关格式的所有信息。
采取:
由此,您可以通过检查第二项是否为无来计算金额
>>> sum(1 for _, field_name, _, _ in l if field_name is not None)
2
因此,您可以使用:
def count_formats(format_string):
f = string.Formatter()
formats = f.parse(format_string)
return sum(1 for _, field_name, _, _ in formats if field_name is not None)
但是,这不适用于嵌套格式。因此,我们需要检查什么可以嵌套:
>>> list(f.parse('{}'))
[('', '', '', None)]
>>> list(f.parse('{:{}}'))
[('', '', '{}', None)]
>>> list(f.parse('{{}:{}}'))
ValueError: Single '}' encountered in format string
>>> list(f.parse('{!{}:{}}'))
ValueError: Single '}' encountered in format string
所以我们只需要检查格式规范,看看是否有任何嵌套格式。因此,如果您愿意,可以将count\u格式
更改为嵌套格式:
def count_formats(format_string):
def nested(s):
for hit in f.parse(s):
yield hit
if hit[2]:
for nested_hit in nested(hit[2]):
yield nested_hit
f = string.Formatter()
formats = nested(format_string)
return sum(1 for _, field_name, _, _ in formats if field_name is not None)
因为我是花括号,我的C不是很好。我已经几十年没有研究过它了,所以我不知道C是如何工作的。你能用Python回答吗?谢谢@哦,我不会为您编写Python代码,但我确实为您将C翻译成了伪代码。英语也是一种没有大括号的语言。然而,这是完全错误的,因为无论期望值是多少,它总是返回零。简单的例子:
{}
另一个:pi={:0.2f},e={:0.4f}
。你不必“为我编写Python代码”,但别忘了在发布之前至少测试一下你的答案的有效性。对于Python的“新风格”格式,我想知道仅仅计算{
的数量是否至少可能是答案的开始,也许是确认了相同数量的}
?或者也许你发布的伪代码中有一个小错误?@Peilonrayz这是我到目前为止得到的,理想的情况是有比我更好的人来发布更好的答案。如前所述,我对Python的非数字用法还不熟悉。如有任何改进或新答案,将不胜感激!我将只对简单的格式和数字值使用它,但是一个更一般的答案会更好。比我的好!