繁体   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