PLY:非法角色'+'

时间:2017-04-06 22:14:43

标签: python regex python-2.7 ply

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

VAR VAR1 001 
+000 000 000 000

如果代码创建名为VAR 1的变量,则将值0赋给它

我为instanciation写的正则表达式是:

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")

2 个答案:

答案 0 :(得分:1)

您不必在字符类中转义+。您可以使用:

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}'

还注意到您使用了[+|-],这是一个字符类,不适用于替换,因此您必须将其更改为[+-]

因此,最终的正则表达式(使用\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}'

答案 1 :(得分:0)

该行:

print parse("+0 000 000 000")

与您指定的输入格式

不符
VAR VAR1 001 
+000 000 000 000

如果实际数据的格式与+0 000 000 000相同,那么您实际需要:

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

...使用哪个输出:[('INST', '+0 000 000 000')]