【发布时间】:2020-03-05 17:00:20
【问题描述】:
我想这个问题足够基本,答案肯定已经存在,但我的 google-fu 技能一定是欠缺的。
我需要解析以下格式的字符串:upper:lower cc ; ! comment。字符% 用于转义特殊字符%:; !。 : 字符将 upper 与 lower 分隔开来。 ; 字符终止一行。空格字符用于分隔cc 元素。使用! 引入评论。下面的字符串应该被解析如下:
a:b c ; upper="a" lower="b" cc="c" comment=""
a%::b c ; upper="a:" lower="b" cc="c" comment=""
a%%:b c ; ! x upper="a%" lower="b" cc="c" comment=" x"
a%!:b c ; ! x upper="a!" lower="b" cc="c" comment=" x"
a%%%::b c ; upper="a%:" lower="b" cc="c" comment=""
在 python 中完成这项任务的最 Pythonic(即简单、可读、优雅)和健壮的方法是什么?正则表达式合适吗?
我尝试编写一个正则表达式,该表达式使用否定的lookbehind 来检测: 之前的奇数个%s,但显然lookbehinds 不能具有可变长度。
【问题讨论】:
-
这是众所周知的文件格式吗?
-
@AKX 是
lexc,用于xfst相关工具。 -
这里似乎有一个 Lexc 解析器:github.com/Techievena/lexc2dix/blob/master/lexc2dix/… ... 但这似乎很可疑 :) github.com/Techievena/lexc2dix/blob/master/lexc2dix/…
-
解析upper的起点可以是
(%.|[^:])+。然后必须在第二步中处理大写中的转义字符。可以用类似的方式处理更多零件。