背景
我正在使用把手模板语言来创建文档。为了创建JSON文件以使用值填充某个手柄文件,我想使用Python脚本提取该文件中的所有手柄表达式。 Python解析模块似乎适合这项工作,因为它有一个findall函数,可以找到某种模式的所有出现。
问题
Parse使用大括号括起要搜索的模式,例如
parse("One {} three", "One two three")
产量
<Result ('two',) {}>
然而,我正在寻找的模式是如此躲藏起来的
{{{<some expression>}}}
这会迫使我逃避大括号。我尝试使用反斜杠,即
parse("One \{\{\{{}\}\}\} three", "One {{{some_number}}} three")
为了提取
some_number
但这不起作用。还有另一种方式吗?
答案 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循环中的传递。我对这段代码感到内疚。我仍然这样做,但我仍然感觉很擅长绊倒技术。