5

我在使用 pyparsing 时遇到了一些基本问题。下面是测试程序和运行的输出。

aaron-mac:sql aaron$ more s.py

from pyparsing import *

n = Word(alphanums)
a = Group( n | Group( n + OneOrMore( Suppress(",") + n )))
p = Group( a + Suppress(".") )
print a.parseString("first")
print a.parseString("first,second")
print p.parseString("first.")
print p.parseString("first,second.")


aaron-mac:sql aaron$ python s.py
[['first']]
[['first']]
[[['first']]]
Traceback (most recent call last):
 File "s.py", line 15, in <module>
   print p.parseString("first,second.")
 File "/Library/Python/2.6/site-packages/pyparsing.py", line 1032, in parseString
   raise exc
pyparsing.ParseException: Expected "." (at char 5), (line:1, col:6)
aaron-mac:sql aaron$ 

如何修改测试程序中的语法以解析以句点结尾的逗号分隔名称列表?我查看了文档并试图找到一个实时支持列表,但我认为我最有可能在这里得到回复。

4

2 回答 2

6

'|' 运算符创建一个 MatchFirst 表达式,在其中评估备选方案,直到出现第一个匹配项。

Pyparsing 完全从左到右工作,尽可能将解析器表达式应用于输入字符串。pyparsing 所做的唯一前瞻就是您写入解析器的任何内容。

在这个表达式中:

a = Group( n | Group( n + OneOrMore( Suppress(",") + n )))

假设n只是一个文字“X”。如果给这个解析器输入字符串“X”,它显然会匹配前导的、单独的n表达式。如果给定字符串“X,X,X”,它仍然只匹配前导n,因为这是解析器中的第一个替代项。

如果将表达式转换为:

a = Group( Group( n + OneOrMore( Suppress(",") + n )) | n)

然后解析 "X" 它会首先尝试匹配列表,这将失败,然后匹配 lone n。要解析“X,X,X”,第一个选择是列表表达式,它将匹配。

如果要匹配最长的替代项,请使用 '^' 运算符,它给出一个 Or 表达式。或者将评估所有给定的备选方案,然后选择最长的匹配项。

a = Group( n ^ Group( n + OneOrMore( Suppress(",") + n )))

您还可以使用 pyparsing 辅助方法来简化此操作delimitedList。解析由逗号分隔的相同表达式的列表是一种常见情况,因此我不会看到人们不得不expr + ZeroOrMore(Suppress(",") + expr)一遍又一遍地重新发明,而是将其添加delimitedList为标准的 pyparsing 助手。 delimitedList("X")将匹配“X”和“X,X,X”。

于 2011-11-23T05:13:49.190 回答
2

如果您只想涵盖以逗号分隔的名称列表以句点结尾的情况,您可以使用以下内容:

from pyparsing import *
p = Word(alphanums)+ZeroOrMore(Suppress(",")+Word(alphanums))+Suppress(".")

有了这个,你会得到以下结果:

>>> print p.parseString("first.")
['first']
>>> print p.parseString("first,second.")
['first', 'second']

您问题中的其他示例失败,因为它们没有以句点结尾。

于 2011-11-22T23:11:08.593 回答