簡體   English   中英

pyparsing帶引號的字符串

[英]pyparsing string of quoted names

我有一個字符串,可以包含以下內容:

s = "'Mark, Bob','John'"

將其解析為3個字符串的最佳方法是什么? 我真的不了解pyparsing,恐怕我不太了解

(編輯)對不起,我不太清楚。 這是使用語法和pyparsing解析文件的程序的一部分。 這只是輸入的一小部分,我不確定該怎么做。 這實際上應該代表三個名稱的數組,這就是我要使用的名稱。

謝謝

我假設您實際上想要2個字符串,而不是3個(由引號判斷)。

要使用pyparsing,首先要考慮並寫下要解析的格式(實際上,不管您要使用哪種解析庫或工具,這都是一個不錯的第一步)。 它可以像您想要的那樣嚴格,但是讓我們從簡單/高層次開始解決這個問題。 我將使用准BNF形式,其中“ *”表示“ 0個或多個重復”:

list_of_names = quoted_string (',' quoted_string)*

“名稱列表是帶引號的字符串,后跟0個或多個逗號和帶引號的字符串對。”

Pyparsing的類使用的名稱雖然在編碼時可能有些冗長,但相當准確地遵循了相同的形式。

list_of_names = quotedString + ZeroOrMore(',' + quotedString)

Pyparsing還包含一些常用表達式,並且quotedString是其中之一。

現在我們已經定義了list_of_names ,我們可以使用它來解析您的輸入:

s = "'Mark, Bob','John'"
print list_of_names.parseString(s)

我們得到:

["'Mark, Bob'", ',', "'John'"]

好吧,這很丑。 一方面,我們只需要名稱,而不需要任何逗號。 因此,將list_of_names更改為:

list_of_names = quotedString + ZeroOrMore(Suppress(',') + quotedString)

現在,它已經被清理了一點:

["'Mark, Bob'", "'John'"]

您不清楚是否要保留引號。 通常,當我使用字符串時,我只需要字符串內容,而沒有包含引號的字符串。 您當然可以這樣寫:

for name in list_of_names.parseString(s):
    print name.strip("'")

但是,使用此解析后的輸出可能需要做很多事情,並且您不想每次執行某項操作時都麻煩去掉引號。

因此,您可以定義一個解析動作,即在解析時運行的回調,它將清除這些引號。 Pyparsing包含一個稱為removeQuotes ,您可以將其包含在解析器中,如下所示:

quotedString.setParseAction(removeQuotes)

現在,如果我們再次解析您的輸入,我們將得到一個漂亮的列表:

['Mark, Bob', 'John']

最后,這種解析形式為“ something + ZeroOrMore(Suppress(delimiter) + something) ”形式的列表的something + ZeroOrMore(Suppress(delimiter) + something)發生,尤其是當分隔符是逗號時。 因此,pyparsing包含一個稱為delimitedList的輔助方法,該方法發出相同的內容。 您的整個解析器現在看起來像:

quotedString.setParseAction(removeQuotes)
list_of_names = delimitedList(quotedString)

然后,通過在list_of_names表達式上調用parseString方法來提取數據。

#!/usr/bin/python

from pyparsing import *


s = "'Mark, Bob','John'"

fnames = OneOrMore(Suppress(Literal("\'")) | Suppress(Literal("\"")) | Suppress(",") | Word(alphas))

for n in fnames.parseString(s):
    print n

運行時僅輸出名稱:

Mark
Bob
John

暫無
暫無

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

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