获得从模板键(Get keys from template)

2019-07-02 10:02发布

我想获得的所有可能的关键字参数字符串模板可能在替代使用列表。

有没有一种方法比重新做到这一点其他的?

我想要做这样的事情:

text="$one is a $lonely $number."
keys = get_keys(text) 
# keys = ('one', 'lonely', 'number')

我正在写一个简单的疯LIB般的程序,我想与任执行模板替换的String.Format或模板的字符串 。 我希望写的“故事”,并有我的程序产生的所有“关键字”(名词,动词等),用户需要产生一个模板文件。 我知道我可以使用正则表达式做到这一点,但我想知道如果有一个替代的解决方案? 我打开替代的String.Format和字符串模板。

我以为会有解决这个,但我还没有在快速搜索遇到它。 我发现这个问题, 与蟒蛇反向模板 ,但它不是真的是我要找的。 它只是重申,这是可以做到的re

编辑:

我要指出, $$是“$”一种逃避,而不是令牌我想要的。 $$5应该呈现为“5 $”。

Answer 1:

如果它是怎么运用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']

请参阅这里了解更多详情。



Answer 2:

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
    )

而对于你的榜样,

>>> string.Template.pattern.findall("$one is a $lonely $number.")
[('', 'one', '', ''), ('', 'lonely', '', ''), ('', 'number', '', '')]

正如你可以在上面看到,如果你做${one}用大括号将到第三位所产生的元组:

>>> string.Template.pattern.findall('${one} is a $lonely $number.')
[('', '', 'one', ''), ('', 'lonely', '', ''), ('', 'number', '', '')]

所以,如果你想获得所有的按键,你必须做一些事情,如:

>>> [s[1] or s[2] for s in string.Template.pattern.findall('${one} is a $lonely $number.$$') if s[1] or s[2]]
['one', 'lonely', 'number']


Answer 3:

你可以用仪表的字典里面记录的调用,或defaultdict渲染一次,然后检查什么要求。

from collections import defaultdict
d = defaultdict("bogus")
text%d
keys = d.keys()


Answer 4:

尝试str.strip()连同str.split()

In [54]: import string

In [55]: text="$one is a $lonely $number."

In [56]: [x.strip(string.punctuation) for x in text.split() if x.startswith("$")]
Out[56]: ['one', 'lonely', 'number']


Answer 5:

你可以试试:

def get_keys(s):
    tokens = filter(lambda x: x[0] == "$", s.split())
    return map(lambda x: x[1:], tokens)


Answer 6:

为什么你想避免正则表达式? 他们工作得很好这一点:

>>> re.findall(r'\$[a-z]+', "$one is a $lonely $number.")
['$one', '$lonely', '$number']

对于模板,检查应用re.sub ,它可以与回调称为做几乎你想要的东西。



Answer 7:

>>> import string
>>> get_keys = lambda s:[el.strip(string.punctuation) 
                         for el in s.split()if el.startswith('$')]
>>> get_keys("$one is a $lonely $number.")
['one', 'lonely', 'number']


文章来源: Get keys from template