簡體   English   中英

用於解析包含'v。'的標題的pyparsing語法

[英]A pyparsing grammar for parsing titles containing 'v.'

我正在考慮解析表單的標題

<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

因為左邊部分允許使用標點符號(並且只能在第一個點之前工作),所以效果不好

你嫁給了使用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']

如果您只是發布兩個由“v。”分隔的團隊名稱,如“加利福尼亞大學訴聖母大學”,那么您可以通過幾種不同的方式解析。

使用工作的方法之一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。”,你真的在​​考慮LiteralKeyword

我認為, Keyword確實是最合適的解決方案。 Keyword over Literal的目的是Keyword添加了解析字符僅包含給定文字的約束,並且不能與任何其他常見字符相鄰。 因此, Literal("who")將匹配“whoever”的主要部分,但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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM