如何在正则表达式中评估匹配的数字? - Lexing FORTRAN'H'用Ply编辑描述符

时间:2010-02-07 13:12:27

标签: python regex lexical-analysis ply

我使用Ply来解释FORTRAN格式字符串。我在编写正则表达式以匹配形式为

'H' edit descriptor时遇到问题

x H ccccc ...

其中 x 指定在'H'

之后读入的字符数

Ply匹配具有单个正则表达式的标记,但是我在使用正则表达式执行上述操作时遇到问题。我正在寻找类似的东西,

(\d+)[Hh].{\1}

其中\1被解析为整数并被评估为正则表达式的一部分 - 但它不是。

看来it is not possible to use matched numbers later in the same regex,是这样吗?

有没有人有其他可能使用Ply的解决方案?

3 个答案:

答案 0 :(得分:2)

正则表达式无法做到这一点。你可以破解它:

(1[Hh].|2[Hh]..|3[Hh]...|etc...)

难看!

答案 1 :(得分:0)

这就是认为regexp可以取代词法分析器。

简短版本:正则表达式只能处理称为“常规”的所有可能语言的一小部分(我很惊讶,我知道)。但是“常规”并不符合人类对“简单”的理解,因此即使非常简单的语言也可以有非正则表达式。

为简单语言编写词法分析器并不是非常困难。

关于该主题的资源的规范Stack Overflow问题是Learning to write a compiler


阿。我似乎误解了这个问题。 Mea Culpa。

我对ply并不熟悉,因为我使用flex已经有一段时间了,但是认为你会吃任意数量的以下数字,然后检查如果遵守规则,则关联代码块。

答案 2 :(得分:0)

Pyparsing包含一个与此非常相似的自适应表达式,称为countsArray。 countingArray(expr)解析一个前导整数'n',然后解析expr的'n'个实例,将整个数组作为单个列表返回。这种方法的工作方式是countingArray解析一个前导整数表达式,然后是一个未初始化的正向表达式。前导整数表达式附加了一个解析操作,将以下转发分配给'n'* expr。然后,pyparsing解析器继续,并解析以下'n'expr。所以它是一种自我修改的解析器。

要解析表达式,这看起来像是:

integer = Word(nums).setParseAction(lambda t:int(t[0]))
following = Forward()
integer.addParseAction(lambda t: following << Word(printables+" ",exact=t[0]))
H_expr = integer + 'H' + following
print H_expr.parseString("22HThis is a test string.This is not in the string")

打印:

[22, 'H', 'This is a test string.']

如果Ply有类似的东西,也许你可以使用这种技术。