从c风格的python字符串和文本中查找关键字参数

时间:2017-10-04 06:21:34

标签: python-2.7

如何找到传递给c-style python字符串

的关键字参数

鉴于:

bill eats apple
'%(name)s eats %(fruit)s'

应该

{ 'name': 'bill', 'fruit' : 'apple'}

2 个答案:

答案 0 :(得分:1)

首先,Python中没有允许您使用旧样式(又名 C样式)字符串格式化的功能或包。 A good reference about reversing c-style string format

你能拥有的最好的是一个巨大的正则表达式模式,你知道它真的不是一个完美的解决方案。

那就是说,

正如@smarx在评论中所说,你可以使用parse,它非常适合,但是,从给定的doc链接:

  

parse()与format()

相反

这意味着你需要使用format()代替%,这是一件好事,因为%是Python的字符串格式旧样式其中{{3是新样式,自Python3以来最好用(它符合python 2.7 / 3,但不是%)。

以下是format()的示例:

print(parse.parse('{name} eats {fruit}', 'bill eats apple'))
<Result () {'fruit': 'apple', 'name': 'bill'}>

如果您对format()感到不舒服,我建议您查看format(),这是一个非常好的指南。

答案 1 :(得分:1)

如果您不想使用parse,可以使用named groups将模式字符串转换为正则表达式,然后使用re.matchmatch.groupdict来获取映射

>>> text = "bill eats apple"
>>> a = "%(name)s eats %(fruit)s"
>>> p = re.sub(r"%\((\w+)\)s", r"(?P<\1>\w+)", a)
>>> p
'(?P<name>\\w+) eats (?P<fruit>\\w+)'
>>> re.match(p, text).groupdict()
{'fruit': 'apple', 'name': 'bill'}

请注意,\w+只会匹配一个字。为了允许更复杂的名称,您可以使用例如[^(]+以匹配截止)

之前的所有内容
>>> text = "billy bob bobbins eats a juicy apple"
>>> p = re.sub(r"%\((\w+)\)s", r"(?P<\1>[^)]+)", a)
>>> re.match(p, text).groupdict()
{'fruit': 'a juicy apple', 'name': 'billy bob bobbins'}