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

2 投票
1 回答
1004 浏览
提问于 2025-04-17 06:36

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

2

你的问题很好地说明了为什么我不建议大家在定义字符串时使用带空格的字面量,因为这样会让pyparsing的内置跳过空格的功能失效。pyparsing会在表达式之间跳过空格。在你的例子中,你只定义了一个表达式,就是一个包含整个字符串的字面量,这个字符串里包括了单词之间的空格。

如果你想让空格被跳过,可以把你的字符串拆分成几个独立的字面量(把一个字符串加到pyparsing表达式中,会自动把这个字符串构造成一个字面量):

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帮你把字符串拆分开,映射成字面量,然后把整个列表一起传给pyparsing的And:

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

如果你想保留原来的空格,可以把你的表达式放在originalTextFor里面:

my_expr = originalTextFor(my_expr)

撰写回答