Pyparsing:嵌套降价强调

2024-05-16 22:41:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习一些简单的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怎么做呢?还是有更有效的方法?


Tags: 方法texttest版本规范foo语法bar
0条回答
网友
1楼 · 发布于 2024-05-16 22:41:35

想想你想要什么。第二个*何时关闭强调,何时打开嵌套的强调?你没有写任何规则来区分这一点。因为它总是100%模棱两可,这意味着你唯一可能得到的结果是:

  • 任何强调都不能结束,或者
  • 强调不能嵌套。在

我怀疑你在问如何从第二个切换到第一个。在

那么你想要什么?在

您需要实现某种规则来消除这两种可能性的歧义。在

事实上,如果您阅读链接到的文档,它们有一组复杂的规则,这些规则精确地定义了*何时可以打开强调,何时不能打开,对于closng也同样如此;给定这些规则,如果它仍然不明确,它就会关闭强调。你必须实现这一点。在

网友
2楼 · 发布于 2024-05-16 22:41:35

有了这些附加规则,我认为您根本不必担心递归,只要在找到开始和结束强调表达式时处理它们,不管它们是否匹配:

from pyparsing import *

openEmphasis = (LineStart() | White()) + Suppress('*')
openEmphasis.setParseAction(lambda x: ''.join(x.asList()+['<em>']))
closeEmphasis = '*' + FollowedBy(White() | LineEnd())
closeEmphasis.setParseAction(lambda x: '</em>')

emphasis = (openEmphasis | closeEmphasis).leaveWhitespace()

test = """
*foo *bar* bar*
"""
print test
print emphasis.transformString(test)

印刷品:

^{pr2}$

你不是第一个被这种申请绊倒的人。当我在PyCon'06上演示时,一位热心的与会者马上就来解析一些降价,输入字符串是"****a** b**** c**"之类的。我们一起做了一些工作,但是消歧规则对于基本的pyparsing解析器来说太过上下文敏感了。在

相关问题 更多 >