2017-04-06 81 views
0

我上一个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]' 

但是我运行程序时,厚度打印以下内容:

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

应使用\ d来表示字符,还可以使用{}表示的重复序列:\ + - ](:\ d {3} \ S? ){4} – Neil

+0

为什么反斜杠?你希望在正常情况下使用它,但是它在字符类中没有意义。实际上,除非'|'是一个有效的第一个字符,否则你可能需要'[+ - ]',而不是'[+ | - ]'。 –

+0

顺便说一句,将你的再现器 - 尽可能保留为*最小*将被扩展到它的*完整*和*可验证*的位置,如http://stackoverflow.com/中所给出的那样。帮助/ MCVE。现在,有人需要做一些相当的工作来重现错误。 –

回答

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')]

+0

这是一个正则表达式,我在回答中使用'\ s'作为快捷键和非捕获组。这听起来更像是对我的问题的评论。另外,你使用了'{2}'并且应该是'{3}' –

+0

对于OP的测试数据,不,它真的应该是** {2}'。他们的评论是误导正在使用的实际数据格式。 (这就是为什么我花时间让他们提供一个真正的复制者,而不是直接写答案)。 –

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

......这里的问题(即我选择写出一个相互竞争的答案而不是评论这个问题的不良行为)是因为你写了一个答案,但实际上没有一个真正的复制者可能会产生他们的问题,因此不能保证你*真的知道OP的问题究竟是什么。即使're.compile(r'[\ + | - ]')。match('+')'不起作用,我同意会有强烈的猜测依据,但情况并非如此:最初的代码是* bad *,但是(可测试!)没有打破最初给出的任何理由。 –

+0

...的确,'re.compile(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]')match('+ 0 000 000 000 000 ')'返回一个匹配。 –