用Python中的_replacements_匹配整个Ruby风格的字符串



我想用替换来匹配单个Ruby风格的字符串,看起来像:

"some ugly text #{Class.new().method("argument")}"

正如你可能看到的,令人讨厌的是,它允许双引号出现在模板中而不需要转义。

我需要将角双引号之间的整个文本捕获为单个字符串。不需要对replacements进行进一步处理。

我想在一个正则表达式中完成它,以提供我的简单标记器。

以下似乎有效:

>>> check = re.compile(r'("((#{([^}]|["])*})|\.|[^"])*")|('(\.|[^'])*')').match
>>> check('"Text"').end()
6
>>> check('"Text #{}"').end()
10
>>> check('"Text #{"}"').end()
11
>>> check('"Text #{""}"').end()
12
>>> check('"Text #{"foo"}"').end()
16

有时,仅仅提出问题就有助于解决问题。我的标记化器开始正确地处理那个正则表达式,所以问题解决了。

棘手的部分是([^}]|["])*,它消耗了replacement内部的东西,被#{}包围,得到了#{([^}]|["])*}。我现在不需要双花括号。

最后一部分使用单引号中的字符串,所以不要感到惊讶。

最新更新