1

我正在考虑解析表单的标题

<left part> v. <right part>

通过使用pyparsing. 左侧部分可以是包含字母数字字符的名称,包括 utf-8 字符和标点符号。甚至v.它本身也允许在左侧。然而v.,中间的总是用空格与两个部分隔开。

可以为这种情况定义语法吗?

我所做的努力:

name = Word(alphas)
part1 = OneOrMore(name).setParseAction(lambda tokens:" ".join(tokens))
part2 = OneOrMore(name)
v_en = Word("v.").suppress()
v_fr = Word("c.").suppress()
versus = v_en 

expression = part +  versus + part2

不能很好地工作,因为左侧允许使用标点符号(并且只在第一个点之前有效)

4

2 回答 2

2

您是否接受使用 pyparsing 的想法?因为如果您不是,那么您可以使用 python 内置功能快速解决您的问题,假设如下:

'v.' 不会出现在

对于给定的标题,请尝试:

>>> pattern = ' v. '
>>> title.rsplit(pattern, 1)

例如,

>>> 'this is a v. simple test'.rsplit(pattern, 1)
['this is a', 'simple test']
>>> 'A more v. complicated v. example'.rsplit(pattern, 1)
['A more v. complicated', 'example']
于 2013-10-04T01:20:00.443 回答
1

如果您只是发布两个用“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.”,您实际上是在考虑Literalor Keyword

Keyword我认为确实是最合适的解决方案。Keywordover的目的LiteralKeyword增加解析字符只包含给定文字的约束,并且不能有任何其他常见的单词字符相邻。所以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
于 2013-10-07T01:16:29.250 回答