pyparsing字符串的引用名称

时间:2013-11-08 15:20:13

标签: python string pyparsing

我有一个字符串可以包含这样的内容:

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

将此解析为3个字符串的最佳方法是什么?我对pyparsing很新,我担心我不太了解它

(编辑)对不起,我不太清楚。这是使用语法和pyparsing来解析文件的程序的一部分。这是输入的一小部分,我不知道该怎么做。这应该真正代表一个由三个名字组成的数组,这就是我想要从中得到的。

由于

2 个答案:

答案 0 :(得分:7)

我假设你真的想要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)形式列表的业务发生了很多,特别是当分隔符是逗号时。所以pyparsing包含一个名为delimitedList的辅助方法,它发出相同的东西。您的整个解析器现在看起来像:

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

您可以通过调用parseString表达式上的list_of_names方法来提取数据。

答案 1 :(得分:2)

#!/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