【发布时间】:2016-06-15 19:45:01
【问题描述】:
我想解析格式如下的字符串:
[{text1}]{quantity}[{text2}]
这条规则意味着在开头有一些文本可以选择存在或不存在,然后是 {quantity},其语法我将在下面描述,然后是更多可选文本。
{quantity} 可以有多种形式,其中 {n} 是任何正整数
{n}
{n}PCS
{n}PC
{n}PCS.
{n}PC.
Lot of {n}
此外,它应该接受这个附加规则:
{n} {text2}
在此规则中,{n} 后跟一个空格,然后是 {text2}
在出现PC或PCS的情况下
- 它后面可能跟也可能不跟一个点
- 不区分大小写
- 可以选择在 {n} 和 PCS 之间出现空格
- 以下内容全部被剥离:PC 或 PCS、可选的点和可选的空格
所需的输出被归一化为两个变量:
- {n} 为整数
- [{text1}] [{text2}],即第一个 {text1}(如果存在),然后是空格,然后是 {text2}(如果存在),连接到一个字符串。仅当有两个文本段时才使用空格分隔文本段。
如果 {quantity} 包含除正整数以外的任何内容,则 {n} 仅包含整数,并且 {quantity} 的其余部分(例如“PCS.”)从 {n} 和结果文本中删除字符串。
在文本部分,可能会出现更多的整数。找到的 {quantity} 以外的任何内容都应视为文本的一部分,而不是解释为另一个数量。
我是一名前 C/C++ 程序员。如果我必须用这些语言来解决这个问题,我可能会在 lex 和 yacc 中使用规则,否则我将不得不编写很多讨厌的代码来手动解析它。
我想学习一种在 Python 中高效编码的简洁方法,可能使用某种形式的规则来轻松支持更多案例。我想我可以在 Python 中使用 lex 和 yacc,但我想知道是否有更简单的方法。我是 Python 新手;我什至不知道从哪里开始。
我并不是要求任何人为一个完整的解决方案编写代码,而是我需要一两种方法,也许还有一些示例代码来展示如何做到这一点。
【问题讨论】:
-
首先要弄清楚的问题是您的语言是否与上下文无关。这将决定您是否可以使用正则表达式或类似工具。如果你不能,那么老实说,yacc 是这项工作的默认工具。 yacc 可能有一个 python 特定的包,但原来的包也一样 :-)
-
PLY 是 Python 的 lex-yacc,但 pyparsing 可能更容易走出大门。
-
我认为它是上下文无关的,从某种意义上说,会有单独的一行项目被单独分析。所以你是在为无上下文数据行建议正则表达式?