[英]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.