Mar*_*ark 1 python string pyparsing
我有一个字符串,可以包含这样的东西:
s = "'Mark, Bob','John'"
Run Code Online (Sandbox Code Playgroud)
解析为3个字符串的最佳方法是什么?我对pyparsing很新,我担心我不太了解它
(编辑)对不起,我不是很清楚.这是使用语法和pyparsing来解析文件的程序的一部分.这是输入的一小部分,我不知道该怎么做.这应该真正代表一个由三个名字组成的数组,这就是我想要从中得到的.
谢谢
我假设你实际上想要2个字符串,而不是3个字符串(用引号来判断).
要使用pyparsing,你首先要仔细思考并写下你要解析的格式(无论你将使用什么样的解析库或工具,这实际上都是一个很好的第一步).它可以像你想要的那样严格,但让我们从这个问题的简单/高级开始.我将使用准BNF形式,其中'*'表示"0或更多重复":
list_of_names = quoted_string (',' quoted_string)*
Run Code Online (Sandbox Code Playgroud)
"名称列表是带引号的字符串,后跟0或更多逗号和引用的字符串对."
Pyparsing的类使用的名称虽然编码可能有点冗长,但却相当准确地遵循相同的形式.
list_of_names = quotedString + ZeroOrMore(',' + quotedString)
Run Code Online (Sandbox Code Playgroud)
Pyparsing还包括一些常用表达式,quotedString是其中之一.
现在我们已经定义了list_of_names,我们可以用它来解析你的输入:
s = "'Mark, Bob','John'"
print list_of_names.parseString(s)
Run Code Online (Sandbox Code Playgroud)
我们得到:
["'Mark, Bob'", ',', "'John'"]
Run Code Online (Sandbox Code Playgroud)
嗯,那很难看.首先,我们只想要名称,而不是任何分隔逗号.所以list_of_names改为:
list_of_names = quotedString + ZeroOrMore(Suppress(',') + quotedString)
Run Code Online (Sandbox Code Playgroud)
而现在它已经清理了一下:
["'Mark, Bob'", "'John'"]
Run Code Online (Sandbox Code Playgroud)
您不清楚是否要保留引号.通常当我使用字符串时,我只想要字符串内容,而不是字符串包含引号.你当然可以这样写:
for name in list_of_names.parseString(s):
print name.strip("'")
Run Code Online (Sandbox Code Playgroud)
但是对于这个解析后的输出,你可能想要做很多事情,而且你不想在每次做某事时都不必去除引号.
因此,您可以定义一个解析操作,一个在解析时运行的回调,它将清除这些引号.Pyparsing包含一个名为removeQuotes,并且您将其包含在解析器中,如下所示:
quotedString.setParseAction(removeQuotes)
Run Code Online (Sandbox Code Playgroud)
现在,如果我们再次解析您的输入,我们会得到一个非常干净的列表:
['Mark, Bob', 'John']
Run Code Online (Sandbox Code Playgroud)
最后,这种解析表单列表的业务something + ZeroOrMore(Suppress(delimiter) + something)发生了很多,特别是当分隔符是逗号时.所以pyparsing包含一个调用的helper方法delimitedList,它发出相同的东西.您的整个解析器现在看起来像:
quotedString.setParseAction(removeQuotes)
list_of_names = delimitedList(quotedString)
Run Code Online (Sandbox Code Playgroud)
然后通过调用表达式parseString上的方法来提取数据list_of_names.
| 归档时间: |
|
| 查看次数: |
1200 次 |
| 最近记录: |