擅长:python、mysql、java
<p>似乎Lark的regexp解析器与<code>[</code>和<code>]</code>分别引用为<code>\x5b</code>和<code>\x5d</code>相混淆,并且<code>q</code>字母与regexp根本不匹配。将<code>\x5b</code>替换为<code>\[</code>并将<code>\x5d</code>替换为<code>\]</code>后,语法将解析提供的输入,如下程序所示:</p>
<pre><code>import lark
grammar = r"""
quoted_string : /[\x22]/ qcontentsmtp* /[\x22]/
qcontentsmtp : qtextsmtp | quoted_pairsmtp
quoted_pairsmtp : /[\x5C\x5C]/ /[\x20-\x7E]/
qtextsmtp : /[\x20-\x21\x23-\[\]-\x7E]/
command : [ quoted_string ]
"""
parser = lark.Lark(grammar, start='command')
print(parser.parse('"quoted_string"'))
</code></pre>
<p>(请注意<code>|</code>在字符集中是多余的,它被解释为只是另一个要匹配的字符。)</p>
<p>这不是Python正则表达式的一般限制,它完全能够接受以十六进制转义的<code>[</code>和<code>]</code>:</p>
<pre><code>>>> re.compile(r'[\x23-\x5b\x5d-\x7e]').match('q')
<re.Match object; span=(0, 1), match='q'>
</code></pre>
<p>我现在向百灵鸟的维护者致意</p>