python - 基于 pyparsing 的分割

标签 python parsing pyparsing

所以我想这样做(但使用 pyparsing)

Package:numpy11 Package:scipy
will be split into
[["Package:", "numpy11"], ["Package:", "scipy"]]

到目前为止我的代码是

package_header = Literal("Package:")
single_package =  Word(printables + " ") + ~Literal("Package:")
full_parser  = OneOrMore( pp.Group( package_header + single_package ) )

当前输出是这样的

([(['Package:', 'numpy11 Package:scipy'], {})], {})

我一直希望有这样的事情

([(['Package:', 'numpy11'], {})], [(['Package:', 'scipy'], {})], {})

基本上,其余文本与 pp.printables 匹配

我知道我可以使用 Words,但我想做

all printables but not the Literal

我该如何实现这个目标?谢谢。

最佳答案

你不应该需要负面的前瞻,即。这个:

from pyparsing import *

package_header = Literal("Package:")
single_package =  Word(printables)
full_parser  = OneOrMore( Group( package_header + single_package ) )

print full_parser.parseString("Package:numpy11 Package:scipy")

打印:

[['Package:', 'numpy11'], ['Package:', 'scipy']]

更新:要解析由 | 分隔的包,您可以使用 delimitedList() 函数(现在您还可以在包名称中包含空格) ):

from pyparsing import *

package_header = Literal("Package:")
package_name = Regex(r'[^|]+')  # | is a printable, so create a regex that excludes it.
package = Group(package_header + package_name) 
full_parser = delimitedList(package, delim="|" )

print full_parser.parseString("Package:numpy11 foo|Package:scipy")

打印:

[['Package:', 'numpy11 foo'], ['Package:', 'scipy']]

关于python - 基于 pyparsing 的分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54795385/

相关文章:

python - 过滤 sqlalchemy 连接查询,基于解析的输入构建

python - 在listenFailure后退出Twisted应用程序

python - user_login_failed 信号的 Django 日志用户 IP

c# - 解析 avcC 盒内 SPS 的计时信息时出现问题

c# - 如何从纯文本解析 C# 中的存储过程签名

java - 解析 xml 文件时出现未知主机异常

python - 评估 WFF 逻辑表达式时出现 Pyparsing 错误?

互联网连接中断的 Python 的 urllib.request.urlopen

python - 如何在函数后停止 tkinter?

python - 在 PyParsing 中,如何定义一个 setParseAction 函数来将字符串列表转换为整数列表?