我正在为现有的文件格式编写解析器,问题是语法没有一种方法来指示什么是注解,而不是将所有不是记录的内容都视为注解。(必须是新行的第一个字符),并以斜杠/
结束。记录的开头包含一个4个字符的字符串,用于指示记录的类型(例如&HEAD
或&TIME
),后面跟着参数及其值。记录可以跨多行,如下面的&HEAD
行所示。
好人
以下代码和语法语法适用于记录末尾和记录之间的注解(COM
),甚至由于\Z
与文件末尾匹配而正确地忽略了END_OF_FILE_COMMENTS
。
我试着使用\A
告诉textX忽略文件开头的注解,直到它遇到第一条记录。
第一个
输出量:
head:
chid: PBD
title: Tools
time:
t_begin: 0
t_end: 60
坏人
但是,当注解放在第一条记录之前时,尽管regex模式在regex101上工作,但模型完全是空的
一个
问题
1.有没有办法让这个工作与语言注解?
1.如果第一个问题的答案是“否”,那么我在Model
或BEG_OF_FILE_COMMENTS
语法中遗漏了什么?
1条答案
按热度按时间b1payxdu1#
Comment
注解规则在每两个连续标记之间尝试,因此不能在这种情况下使用,因为它将在记录内部尝试,并且注解可以是任何内容(实际上,对于这种语言,注解不能是记录的一部分)。1.问题是
BEG_OF_FILE_COMMENTS
无法像应用匹配空白跳过之前那样匹配\A
,因此当规则获得匹配更改时,您将越过开头。您可以为规则使用noskipws
修饰符,或者完全删除该约束。但是,删除约束现在会消耗记录,以防止在规则开头添加[^&]
。就像这样:我已经在开头使用注解和不使用注解进行了测试。另外,请注意,您始终可以将
debug=True
传递给(meta)model_from_str
,以查看解析过程中如何进行匹配。