Pyparsing - 在不同位置使用换行符的文字文本

时间:2011-11-18 19:15:21

标签: python location line-breaks literals pyparsing

我正在使用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 个答案:

答案 0 :(得分:2)

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

您可以通过将字符串分成单独的Literals来跳过空格(将字符串添加到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并且:

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

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

my_expr = originalTextFor(my_expr)