PLY:非法字符“+”

PLY: Illegal Character '+'

我正在使用 ply 开发 python 解析器,我必须以以下形式解析输入:

VAR VAR1 001 
+000 000 000 000

代码将创建一个名为 VAR 1 的变量,然后将值 0 赋给它

我为实例化写的正则表达式是:

t_INST = r'[\+|-]0[ ][0-9][0-9][0-9][ ][0-9][0-9][0-9][ ][0-9][0-9][0-9][ ][0-9][0-9][0-9]'

但是当 运行 我的程序时,PLY 打印以下内容:

Illegal character '+'

复制者如下:

import ply.lex as lex

tokens = ['INST']
t_INST = r'[+-]0[ ](\d{3}[ ]){3}\d{3}';
t_ignore  = ' \t'
def t_error(t):
    print("Illegal character '%s'" % t.value[0])
    t.lexer.skip(1)

lexer = lex.lex()

def parse(input_string):
    ret = []
    lexer.input (input_string)
    while True:
        tok = lexer.token()
        if not tok:
            break      # No more input
        ret.append((tok.type, tok.value))
    return ret

print parse("+0 000 000 000")

您不必在字符 class 内转义 +。您可以使用:

t_INST = r'[+|-]0[ ][0-9][0-9][0-9][ ][0-9][0-9][0-9][ ][0-9][0-9][0-9][ ][0-9][0-9][0-9]'
   this-----^

无论如何,您可以像这样缩短您的正则表达式:

t_INST = r'[+|-]0[ ][0-9]{3}[ ][0-9]{3}[ ][0-9]{3}[ ][0-9]{3}'

甚至:

t_INST = r'[+|-]0[ ]([0-9]{3}[ ]){3}[0-9]{3}'

还注意到你用了[+|-],这是一个字符class,不支持交替,所以你必须把它改成[+-]

因此,最终的正则表达式(使用 \d 作为 [0-9] 的快捷方式)将是:

t_INST = r'[+-]0[ ](\d{3}[ ]){3}\d{3}'

顺便说一句,您的示例文字说:

+000 000 000 000

但是您使用的正则表达式与此匹配:

+0 000 000 000 000

因此,如果您要匹配的数据是 +000 000 000 000,那么您必须将正则表达式更改为:

t_INST = r'[+-](\d{3}[ ]){3}\d{3}'

行:

print parse("+0 000 000 000")

与您声明的

输入格式不符
VAR VAR1 001 
+000 000 000 000

如果 actual 数据与 +0 000 000 000 的形式相同,那么你实际上想要:

t_INST = r'[+-]0\s(?:\d{3}\s){2}\d{3}'

...输出为:[('INST', '+0 000 000 000')]