Pyparsing - 在不同位置带有换行符的文字文本

Posted

技术标签:

【中文标题】Pyparsing - 在不同位置带有换行符的文字文本【英文标题】:Pyparsing - literal text with line breaks in varying locations 【发布时间】:2012-01-01 12:52:46 【问题描述】:

我正在使用 pyparsing 来解析包含行结束位置不同的文本的文档。无论换行位置如何,我都需要编写一个与文本匹配的解析器表达式。以下方法不起作用:

from __future__ import print_function
from pyparsing import *

string_1 = """The quick brown 
fox jumps over the lazy dog.
"""

string_2 = """The quick brown fox jumps
over the lazy dog.
"""

my_expr = Literal(string_1)
print(my_expr.searchString(string_1)
print(my_expr.searchString(string_2)

这会导致控制台上显示以下内容:

[['The quick brown \nfox jumps over the lazy dog.\n']]
[]

由于 ParserElement.DEFAULT_WHITE_CHARS 中包含换行符,我不明白为什么两个字符串都不匹配我的表达式。如何创建一个解析器元素,无论在哪里出现换行符,它都匹配文本?

【问题讨论】:

【参考方案1】:

您的问题是一个很好的例子,说明为什么我不鼓励人们使用嵌入的空格来定义文字,因为这会破坏 pyparsing 的内置空格跳过。 Pyparsing 会跳过 表达式之间的空格。在您的情况下,您只指定了一个表达式,一个包含整个单词字符串的 Literal,包括它们之间的空格。

您可以通过将字符串分解为单独的 Literal 来跳过空格(将字符串添加到 pyparsing 表达式会自动从该字符串构造 Literal):

from pyparsing import *

my_expr = Literal("The") + "quick" + "brown" + "fox" + "jumps" + "over" + "the" + "lazy" + "dog"

string_1 = """The quick brown 
fox jumps over the lazy dog.
"""

string_2 = """The quick brown fox jumps
over the lazy dog.
"""

for test in (string_1, string_2):
    print '-'*40
    print test
    print my_expr.parseString(test)
    print

如果您不喜欢输入所有这些单独的带引号的字符串,您可以让 Python 为您拆分字符串,将它们映射到 Literals,然后输入整个列表以组成一个 pyparsing And:

my_expr = And(map(Literal, "The quick brown fox jumps over the lazy dog".split()))

如果您想保留原始空格,请将您的表达式包装在originalTextFor

my_expr = originalTextFor(my_expr)

【讨论】:

谢谢保罗,这很有帮助。我将使用地图方法。

以上是关于Pyparsing - 在不同位置带有换行符的文字文本的主要内容,如果未能解决你的问题,请参考以下文章

PHPWord使用PHPWord替换模板变量大段文字并换行设置字体字号

pyparsing用分号而不是逗号解析csv文件

Markdown 基本格式

pyparsing:定制自己的解析器

Objective-C自定义UITextView(placeholder,长按换行,文字位置文字间距等)

带有图像浮动选项的文本溢出