我使用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的解决方案?
答案 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有类似的东西,也许你可以使用这种技术。