【问题标题】:Instaparse: How to recognise a newlineInstaparse:如何识别换行符
【发布时间】:2020-05-25 00:53:12
【问题描述】:

我想解析包含换行符的文件的文本。该文件可以在 Windows 或 Unix 中,但目前它是一个包含以下内容的 Windows 文件:

(**************
***************)

上述文件内容已用slurp 读入,并将包含一个换行符。这是我尝试使用的语法:

S = start-comment stars <inside-comment>
start-comment = '('
stars = '*' +
<inside-comment> = '\n' +

这个语法也是从一个文件中偷来的,我相信这会让事情变得更容易一些:

“唯一需要的转义字符是字符串和正则表达式的普通转义字符(此外,instaparse 还支持在单引号字符串中使用 \')。”

换行符似乎没有被解析:

Parse error at line 1, column 16:
(**************
               ^
Expected one of:
"\n"
"*"

我需要将&lt;inside-comment&gt; 设置为什么,以便错误出现在第二行的第一个星号上,这表明语法已识别换行符?

【问题讨论】:

    标签: instaparse


    【解决方案1】:

    Windows 中的换行符显示为 \r\n,而 Unix 中的换行符显示为 \n。所以你需要这样的东西:

    #'\r?\n'
    

    如果您的语法在字符串中,则加倍黑斜线:

    "some-rule = #'\\r?\\n'"
    

    【讨论】:

    • 不幸的是,这并没有帮助,即使将反斜杠加倍 - 只是得到了类似的“预期之一”
    • 抱歉,井号字符被表单删除了。这应该是一个正则表达式。 #'r?\n'
    【解决方案2】:

    这样解析到最后:

    S = start-comment stars <inside-comment-1> stars end-comment
    start-comment = '('
    end-comment = ')'
    stars = '*' +
    <inside-comment-1> = '\n' | '\r\n'
    <inside-comment-2> = '\r?\n'
    

    请注意,&lt;inside-comment-2&gt; 不起作用。虽然&lt;inside-comment-1&gt; 有效,但可能有一种更优雅的方式来越过换行符?

    【讨论】:

      猜你喜欢
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      相关资源
      最近更新 更多