从模板中获取密钥

Yan*_*ann 12 python string-formatting

我想得到一个字符串模板可能在替换中使用的所有可能关键字参数的列表.

有没有办法做到这一点而不是重新?

我想做这样的事情:

text="$one is a $lonely $number."
keys = get_keys(text) 
# keys = ('one', 'lonely', 'number')
Run Code Online (Sandbox Code Playgroud)

我正在编写一个简单的类似Mad-lib的程序,我想用string.formatTemplate字符串执行模板替换.我想写"故事"并让我的程序生成一个模板文件,其中包含用户需要生成的所有"关键字"(名词,动词等).我知道我可以用正则表达式做到这一点,但我想知道是否有替代解决方案?我愿意接受string.format和string template的替代方案.

我认为会有解决方案,但我没有快速搜索过.我确实发现了这个问题,用python反向模板,但它并不是我想要的.它只是重申可以做到这一点re.

编辑:

我应该注意到这$$是'$'的转义,并不是我想要的标记.$$5应该渲染到"5美元".

Rom*_*lov 25

如果可以使用string.format,请考虑使用内置类string.Formatter,该类具有以下parse()方法:

>>> from string import Formatter
>>> [i[1] for i in Formatter().parse('Hello {1} {foo}')  if i[1] is not None]
['1', 'foo']
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参见此处


Joa*_*anc 8

string.Template类有是使用作为属性的模式.您可以打印模式以获取匹配的组

>>> print string.Template.pattern.pattern

    \$(?:
      (?P<escaped>\$) |   # Escape sequence of two delimiters
      (?P<named>[_a-z][_a-z0-9]*)      |   # delimiter and a Python identifier
      {(?P<braced>[_a-z][_a-z0-9]*)}   |   # delimiter and a braced identifier
      (?P<invalid>)              # Other ill-formed delimiter exprs
    )
Run Code Online (Sandbox Code Playgroud)

而对于你的例子,

>>> string.Template.pattern.findall("$one is a $lonely $number.")
[('', 'one', '', ''), ('', 'lonely', '', ''), ('', 'number', '', '')]
Run Code Online (Sandbox Code Playgroud)