我正在使用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")
答案 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')]