python - 如何使用lark ebnf解析字符串内的~{expr}

标签 python regex parsing ebnf lark-parser

我正在尝试为 dsl 编写 lark 语法,但在使用此字符串插值语法时遇到问题:

" abc " <- normal string
" xyz~{expression}abc " <- string with interpolation

因此 ~{ 从字符串切换到表达式,而 } 终止该表达式。我认为这很接近:

string : "\"" (string_interp|not_string_interp)* "\""
string_interp: "~{" expression "}"
not_string_interp: /([^~][^{])+/

但是正则表达式只会匹配偶数个字符,如果 ~{ 跨越偶数边界,它将被错过。

not_string_interp: /(.?|([^~][^{])+)/

这是我所能得到的,但似乎仍然是错误的。我可以使用前瞻吗?我还想保持 %ignore WS 开启,因为它可以大大降低噪音,所以解决方案解决这个问题会很棒!

谢谢

测试用例:

""
"a"
"~{1}"
" ~{1} "
"a bc~{1}c d"
"a b~{1}c d"

最佳答案

我认为这样就可以了。遗憾的是,任何 ~ 后面不跟 { 都会将字符串分开,但我可以稍后重建它们。我被规则的平等优先级和正则表达式的贪婪所愚弄。

/[^"~]+/ 任何不是 ~ 或 "(常规字符串)的内容

"~{"表达式"}"普通表达式

/~(?!{)/ 在不带 { 的情况下处理 ~。使用 ?!因为我们不能消耗下一个字符(它可能是“或另一个〜)

from lark import Lark

print (Lark(r"""
    string: "\"" string_thing* "\""
    string_thing: /[^"~]+/
        | "~{" expression "}"
        | /~(?!{)/
    expression: /[^}]+/
""", start='string', ambiguity="explicit").parse(
# '"a"'
'"a~b{}c}d~{1}g"'
# '"~abc~"'
# '"~{1}~~{1}~~~{1}"'
).pretty())

关于python - 如何使用lark ebnf解析字符串内的~{expr},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51327312/

相关文章:

python - Tornado Restful 处理程序类

javascript - 使用正则表达式呈现格式化的电话号码

java - 插入命名属性值,a la Ant

python - Pandas 单词中重复的元音和辅音

python - 使用 keras ImageGenerator 训练多输入模型

python - 将不同列长度的 numpy 矩阵的条目放入一维数组中

C# 电话号码检查

java - 不区分大小写的 POSIX 正则表达式在 Java Pattern & Matcher 中不区分大小写

Ruby 1.9.2 - 读取和解析远程 CSV

c++ - 在 Qt 中使用正则表达式查找两个标签之间的字符串