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