如何使用Python解析解析handlebarsjs中的三重藏匿标记

时间:2017-04-13 04:36:27

标签: python parsing handlebars.js

背景

我正在使用把手模板语言来创建文档。为了创建JSON文件以使用值填充某个手柄文件,我想使用Python脚本提取该文件中的所有手柄表达式。 Python解析模块似乎适合这项工作,因为它有一个findall函数,可以找到某种模式的所有出现。

问题

Parse使用大括号括起要搜索的模式,例如

parse("One {} three", "One two three")

产量

<Result ('two',) {}>

然而,我正在寻找的模式是如此躲藏起来的

{{{<some expression>}}}
这会迫使我逃避大括号。我尝试使用反斜杠,即

parse("One \{\{\{{}\}\}\} three", "One {{{some_number}}} three")

为了提取

some_number

但这不起作用。还有另一种方式吗?

1 个答案:

答案 0 :(得分:0)

老实说,这可能不太有用,但我有一个你可以使用的糟糕黑客。我发现有一天我可以通过在带有嵌套大括号的字符串上调用format来进行某种部分应用(通常在for循环中)。这是一个例子:

In [1]: url = "http://{hostname}:{{port}}/{{{resource}}}"

In [2]: url.format(hostname="localhost", resource="new_var_name")
Out[2]: 'http://localhost:{port}/{new_var_name}'

三个支架内部有一组防护支架,而双支架只是将外套剥离。我从来没有使用三重括号,因为除非你做一些肮脏的动态编程,否则你想要重命名你的变量,但我离题了......

无论如何,当你去四个大括号时,这会变得非常奇怪(但我通常只保留一个和两个):

In [3]: url = "http://{hostname}:{{port}}/{{{endpoint}}}/{{{{resource}}}}"

In [4]: url.format(hostname="localhost", endpoint="wut").format(port=1, wut="hey")
Out[4]: 'http://localhost:1/hey/{resource}'

In [5]: url.format(hostname="localhost", endpoint="wut").format(port=1, wut="hey").format(
    ...: resource="thatsright")
Out[5]: 'http://localhost:1/hey/thatsright'

无论如何,我觉得如果你可以把3个大括号减少到两个,那么你可能只是在整个结果字符串上调用format来做生意并得到你需要的东西。 (不知道会有多高效)。

我用这个hack编写了一些脏代码,你必须狠狠地眯着眼睛去理解它在做什么,因为它是一个类似于{}{}{{}}{{}}的字符串,然后我插入了单曲和将后者保存为for循环中的传递。我对这段代码感到内疚。我仍然这样做,但我仍然感觉很擅长绊倒技术。