如果您只是发布两个用“v.”分隔的团队名称,例如“Univ. of Calif. v. Univ. of Notre Dame”,那么您可以用几种不同的方式解析它。
一种行不通的方法是使用Word
您在帖子中的方式。Word
旨在指定的不是特定的文字词,而是由特定字符串中的字符组成的词组。例如,如果您尝试解析所有大写单词的首字母缩略词,那么您可以将其定义为:
acronym = Word(alphas.upper())
这将匹配“GE”、“IBM”、“CIA”、“FBI”等。
Word("blah")
将匹配“bah”、“hal”、“bbba”、“hhhbbll”——任何由字母“b”、“l”、“a”或“h”组成的词组。在您的帖子中,Word("v.")
将匹配“vvvv”、“....”、“vvvv” - 任何包含 v 和 . 的相邻组。要定义文字“v.”,您实际上是在考虑Literal
or Keyword
。
Keyword
我认为确实是最合适的解决方案。Keyword
over的目的Literal
是Keyword
增加解析字符只包含给定文字的约束,并且不能有任何其他常见的单词字符相邻。所以Literal("who")
会匹配“谁”的前导部分,但Keyword("who")
不会。
因此,要解析该示例文本,最简单的方法是使用SkipTo
:
from pyparsing import Keyword, SkipTo, restOfLine
test = "Univ. of Calif. v. Univ. of Notre Dame"
vs = Keyword("v.")
matchup = SkipTo(vs)("team1") + vs + restOfLine("team2")
print matchup.parseString(test).dump()
如果您想更具体地了解您的团队,可以尝试以下操作:
from pyparsing import Keyword, Combine, OneOrMore, Word, alphas
vs = Keyword("v.")
teamWord = Word(alphas+".")
teamName = Combine(OneOrMore(teamWord), " ", adjacent=False)
matchup = teamName("team1") + vs + teamName("team2")
print matchup.parseString(test).dump()
但这会给你这个例外
pyparsing.ParseException: Expected "v." (at char 38), (line:1, col:39)
就像现在一样,分隔的“v”。匹配为有效的团队词。在建立团队词之前,您需要包含一个否定的前瞻,以便“v”。不会被误认为是一个。
teamWord = ~vs + Word(alphas+".")
将打印出:
['Univ. of Calif.', 'v.', 'Univ. of Notre Dame']
- team1: Univ. of Calif.
- team2: Univ. of Notre Dame