我正在学习一些简单的Markdown文本来学习Pyparsing和语法。我几乎马上就遇到了一个问题,我很难解决。我试图解析CommonMark规范的一个简单版本,以强调。在此设置中,允许嵌套强调,以便
*foo *bar* baz*
应给出:
^{pr2}$我尝试过使用递归定义来匹配它,但它不起作用。下面是一些示例代码:
from pyparsing import *
text = Word(printables,excludeChars="*")
enclosed = Forward()
emphasis = QuotedString("*").setParseAction(lambda x: "<em>%s</em>" % x[0],contents=enclosed)
enclosed << emphasis | text
test = """
*foo *bar* bar*
"""
print emphasis.transformString(test)
但我从中得到的是:
<em>foo </em>bar<em> bar</em>
原谅我的愚蠢,有人能给我指出正确的方向吗?
编辑:
很好的回答了我的问题。我只是在玩,所以我可以使用任意限制的符号形式。我假设只有单个的'*'出现,并且它们不会相邻出现。这就留下了空格来消除歧义:*后面不跟空格会打开强调,而*前面没有空格则会关闭它。
即使这样,我也不确定如何继续Pyparsing。某种基于堆栈的方法,当它们验证为关闭时,按opening*并弹出它们?用Pyparsing怎么做呢?还是有更有效的方法?
想想你想要什么。第二个
*
何时关闭强调,何时打开嵌套的强调?你没有写任何规则来区分这一点。因为它总是100%模棱两可,这意味着你唯一可能得到的结果是:我怀疑你在问如何从第二个切换到第一个。在
那么你想要什么?在
您需要实现某种规则来消除这两种可能性的歧义。在
事实上,如果您阅读链接到的文档,它们有一组复杂的规则,这些规则精确地定义了
*
何时可以打开强调,何时不能打开,对于closng也同样如此;给定这些规则,如果它仍然不明确,它就会关闭强调。你必须实现这一点。在有了这些附加规则,我认为您根本不必担心递归,只要在找到开始和结束强调表达式时处理它们,不管它们是否匹配:
印刷品:
^{pr2}$你不是第一个被这种申请绊倒的人。当我在PyCon'06上演示时,一位热心的与会者马上就来解析一些降价,输入字符串是
"****a** b**** c**"
之类的。我们一起做了一些工作,但是消歧规则对于基本的pyparsing解析器来说太过上下文敏感了。在相关问题 更多 >
编程相关推荐