如何找到传递给c-style
python字符串
鉴于:
bill eats apple
'%(name)s eats %(fruit)s'
应该
{ 'name': 'bill', 'fruit' : 'apple'}
答案 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.match
和match.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'}