gpt4 book ai didi

python - PyParsing - 嵌套表达式和匹配标记

转载 作者:行者123 更新时间:2023-12-01 05:51:16 25 4
gpt4 key购买 nike

我今天早些时候发布了一个关于同一问题的问题,但由于该问题的解决方案是切换库,而我现在对另一个库有问题,我想我会提出另一个问题......希望没关系。

所以我不想匹配以下标记:

<text link="no">
...
</text>

我不在乎文本里面有什么,重要的是文本具有链接属性。

我现在使用 pyparsing 如下:

def content_must_not_be_empty_string(tokens):
if tokens[0]=="":
raise ParseException("content cannot be empty")

text_start = Regex('<text[^<]*>')
text_no_start = Regex('<text[^<]*link="no"[^<]*>')
text_no_end = Regex('</text>[ \t\n\r\xa0]*')
text_no_content = SkipTo(text_no_start | text_no_end | text_start)
text_no_content.setParseAction(content_must_not_be_empty_string)
text_no = nestedExpr(text_no_start,text_no_end,text_no_content)
text_no.setParseAction(somemethod)

起初,由于空 token ,整个事情循环了,这就是我添加 content_must_not_be_empty 的原因。

现在它不再循环,但某些方法也没有执行。

非常感谢您的帮助。

最佳答案

严格来说,pyparsing 不是一个 XML 解析库,但它确实包含一些从 XML 和 HTML 中提取数据的内置支持,而不是解析整个文档。我并不是说您可以在 Regex 元素中嵌入正则表达式。相反,请考虑使用 makeXMLTags 或 makeHTMLTags:

>>> sample = """<text link="no"> lskdjflskdjf </text>"""
>>> text_start,text_end = makeXMLTags("text")
>>> text_start_no = text_start.copy().setParseAction(withAttribute(link="no"))
>>> expr1 = text_start_no + SkipTo(text_end)('body') + text_end
>>> print expr1.parseString(sample)
['text', ['link', 'no'], False, 'lskdjflskdjf ', '</text>']
>>> print expr1.parseString(sample).dump()
['text', ['link', 'no'], False, 'lskdjflskdjf ', '</text>']
- body: lskdjflskdjf
- empty: False
- endText: </text>
- link: no
- startText: ['text', ['link', 'no'], False]
- empty: False
- link: no

这将使您在从 XML 或 HTML 中提取数据时避免各种意外情况。

现在,如果您确实有嵌套标签,那么您将需要开始深入研究nestedExpr 区域。

>>> sample2 = """<text link="no"> lskdjflskdjf<text>more</text> </text>"""

但我仍然鼓励您使用 makeXMLTags 或 makeHTMLTags 构建标记结构,而不是使用 Regex 来伪造它。

关于python - PyParsing - 嵌套表达式和匹配标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14235462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com