Skip to main content
 首页 » 编程设计

python之pyparsing 带引号的字符串

2025年05月04日21wayfarer

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

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

将其解析为 3 个字符串的最佳方法是什么?我是pyparsing新手,怕不是太懂

(edit) 对不起,我不是很清楚。这是使用语法和 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) 的列表的业务经常发生,尤其是当分隔符是逗号时。所以 pyparsing 包括一个名为 delimitedList 的辅助方法,它发出相同的东西。你的整个解析器现在看起来像:

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

然后您通过调用 list_of_names 表达式的 parseString 方法来提取数据。