python - pyPEG2 解析换行符

标签 python newline pypeg

我正在尝试使用 pyPEG2将 MoinMoin 标记转换为 Markdown,在某些情况下我需要注意换行符。但是,我什至无法让我的换行符解析测试工作。我是 pyPEG 的新手,我的 Python 生锈了。请耐心等待。

代码如下:

#!/usr/local/bin/python3
from pypeg2 import *
import re

class Newline(List):
    grammar = re.compile(r'\n')

parse("\n", Newline)
parse("""
""", Newline)

这导致:

Traceback (most recent call last):
  File "./pyPegNewlineTest.py", line 7, in <module>
    parse("\n", Newline)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pypeg2/__init__.py", line 667, in parse
    t, r = parser.parse(text, thing)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pypeg2/__init__.py", line 794, in parse
    raise r
  File "<string>", line 2

    ^
SyntaxError: expecting match on \n

就好像 pypeg 在\n 之后插入了一个空行。

尝试其他选项,例如

    grammar = re.compile(r'\n', re.MULTILINE)
    grammar = re.compile(r'\r\n|\r|\n', re.MULTILINE)
    grammar = contiguous(re.compile(r'\r\n|\r|\n', re.MULTILINE))

以及它们的各种组合不会更改错误消息(尽管我认为我没有尝试过所有组合)。将 Newline 更改为子类 str 而不是 List 也不会更改错误。

更新

我发现 pypeg 在解析它之前去除了换行符:

#!/usr/local/bin/python3
from pypeg2 import *                 
import re
class Newline(str):
    grammar = contiguous(re.compile(r'a'))

parse("\na", Newline)
parse("""
a""", Newline)

print("Success, of a sort.")

运行结果:

Success, of a sort.

如果我覆盖Newlineparse 方法,我什至看不到换行符。它得到的第一件事是“a”。这与我在其他地方看到的一致。 pypeg 会去除所有前导空格,即使您指定了 contiguous

所以,这就是正在发生的事情。不知道该怎么办。

最佳答案

是的,默认情况下 pypeg 会删除包括换行符在内的空格。 这很容易通过在 parse() 函数中设置可选的 whitespace 参数来配置,例如在:

parse("\na", Newline, whitespace=re.compile(r"[ \t\r]"))

这样做仍然会跳过空格和制表符,但不会跳过换行符 \n。 通过这个例子,解析器现在可以正确地找到语法错​​误:

SyntaxError: expecting match on a

关于python - pyPEG2 解析换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33247213/

相关文章:

javascript - 尊重从 HTML 显示中的 API 响应返回的 "\n"换行符(和特殊字符)

python - pyPEG - 由 `flag()` 函数识别的数据被 `compose()` 函数错误地返回

Python - 如何使用列表理解来填充命名元组值

python - 在 __init__ 中使用空列表作为默认参数,为什么所有实例中的列表都引用同一个列表?

python - 如何实现类的内置sum()?

python - 为什么训练我的朴素贝叶斯分类器需要这么多内存?

c - 读取 '\n' 后 fgets 意外行为

python - 有限的文本 block 被新行分割

python - 在枚举(pypeg)中使用美元符号?

python - pypeg 无法用列表组成语法?