2024-04-27 04:58:52 发布
网友
我有一个可以包含如下内容的字符串:
s = "'Mark, Bob','John'"
把它解析成3个字符串的最佳方法是什么?我对pyparsing真的很陌生,恐怕我不太了解它
(编辑)对不起,我不太清楚。这是使用语法和pyparsing分析文件的程序的一部分。这是输入的一小部分,我不知道该如何处理。这应该代表一个由三个名字组成的数组,这就是我想从中得到的。在
谢谢
我假设你真的想要2个字符串,而不是3个(根据引号判断)。在
要使用pyparsing,首先要考虑并写下要解析的格式(不管您将使用什么解析库或工具,这实际上是一个很好的第一步)。它可以像您想要的那样严格,但是让我们从这个问题的简单/高级开始。我将使用一个准BNF形式,其中'*'表示“0或更多重复”:
list_of_names = quoted_string (',' quoted_string)*
名称列表是一个带引号的字符串,后跟0个或多个逗号和带引号的字符串对
Pyparsing的类使用的名称虽然在编码方面可能有点冗长,但相当精确地遵循相同的形式。在
Pyparsing还包括一些常见的表达式,quotedString就是其中之一。在
{我们现在可以使用你的输入来解析}:
s = "'Mark, Bob','John'" print list_of_names.parseString(s)
我们得到:
["'Mark, Bob'", ',', "'John'"]
好吧,那太难看了。首先,我们只需要名称,而不是任何分隔逗号。因此,将list_of_names改为:
list_of_names
list_of_names = quotedString + ZeroOrMore(Suppress(',') + quotedString)
现在它被清理了一点:
["'Mark, Bob'", "'John'"]
你不清楚是否要保留引号。通常当我处理字符串时,我只需要字符串内容,而不是让字符串包含引号。你当然可以这样写:
for name in list_of_names.parseString(s): print name.strip("'")
但是,对于这个解析后的输出,您可能需要做很多事情,而且您不希望每次执行某个操作时都要剥离引号。在
因此,您可以定义一个parse操作,一个在解析时运行的回调函数,它将清除这些引号。Pyparsing包括一个名为removeQuotes的程序,您可以像这样将它包含在解析器中:
removeQuotes
quotedString.setParseAction(removeQuotes)
现在,如果我们再次分析您的输入,我们会得到一个非常干净的列表:
['Mark, Bob', 'John']
最后,解析something + ZeroOrMore(Suppress(delimiter) + something)形式的列表的工作经常发生,尤其是当分隔符是逗号时。因此pyparsing包含一个名为delimitedList的助手方法,它发出相同的内容。整个解析器现在看起来像:
something + ZeroOrMore(Suppress(delimiter) + something)
delimitedList
quotedString.setParseAction(removeQuotes) list_of_names = delimitedList(quotedString)
通过调用parseString表达式上的parseString方法提取数据。在
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
当run只输出名称时:
我假设你真的想要2个字符串,而不是3个(根据引号判断)。在
要使用pyparsing,首先要考虑并写下要解析的格式(不管您将使用什么解析库或工具,这实际上是一个很好的第一步)。它可以像您想要的那样严格,但是让我们从这个问题的简单/高级开始。我将使用一个准BNF形式,其中'*'表示“0或更多重复”:
名称列表是一个带引号的字符串,后跟0个或多个逗号和带引号的字符串对
Pyparsing的类使用的名称虽然在编码方面可能有点冗长,但相当精确地遵循相同的形式。在
^{pr2}$Pyparsing还包括一些常见的表达式,quotedString就是其中之一。在
{我们现在可以使用你的输入来解析}:
我们得到:
好吧,那太难看了。首先,我们只需要名称,而不是任何分隔逗号。因此,将
list_of_names
改为:现在它被清理了一点:
你不清楚是否要保留引号。通常当我处理字符串时,我只需要字符串内容,而不是让字符串包含引号。你当然可以这样写:
但是,对于这个解析后的输出,您可能需要做很多事情,而且您不希望每次执行某个操作时都要剥离引号。在
因此,您可以定义一个parse操作,一个在解析时运行的回调函数,它将清除这些引号。Pyparsing包括一个名为
removeQuotes
的程序,您可以像这样将它包含在解析器中:现在,如果我们再次分析您的输入,我们会得到一个非常干净的列表:
最后,解析
something + ZeroOrMore(Suppress(delimiter) + something)
形式的列表的工作经常发生,尤其是当分隔符是逗号时。因此pyparsing包含一个名为delimitedList
的助手方法,它发出相同的内容。整个解析器现在看起来像:通过调用
parseString
表达式上的parseString
方法提取数据。在当run只输出名称时:
^{pr2}$相关问题 更多 >
编程相关推荐