我正在尝试编写一个简单的 lex 解析器。目前的应对方式是:from ply import lextokens = ( 'COMMENT', 'OTHER' ) t_COMMENT = r'^\#.*\n' t_OTHER = r'^[^\#].*\n' def t_error(t): raise TypeError("Unknown text '%s'" % (t.value,)) lex.lex()lex.input(yaml) for tok in iter(lex.token, None): print repr(tok.type), repr(tok.value)但是无法解析简单的输入文件: # This is a real comment #And this one also #/* # * # *Variable de feeu # */ ma_var: True It is done, over, kaput 具有以下输出:l'COMMENT' '# This is a real comment\n'Traceback (most recent call last): File "parser_adoc.py", line 62, in <module> main2() File "parser_adoc.py", line 57, in main2 for tok in iter(lex.token, None): File "/usr/lib/python2.7/site-packages/ply/lex.py", line 384, in token newtok = self.lexerrorf(tok) File "parser_adoc.py", line 44, in t_error raise TypeError("Unknown text '%s'" % (t.value,))TypeError: Unknown text '#And this one also#/*# *# *Variable de feeu# */ma_var: Truethis is done'总之,我定义了 2 个正则表达式:一个以开头的行 #一个用于不以开头的行 #但它不起作用。我不明白我的正则表达式有什么问题。你能帮忙吗?
1 回答
心有法竹
TA贡献1866条经验 获得超5个赞
在 python 正则表达式(PLY 使用的)中,^
指的是字符串的开头,而不是行的开头,除非已设置多行模式。因此,由于您的两个规则都以 开头^
,因此它们只能在第一行匹配。
您可以通过将正则表达式包装在 中来解决此问题(?m:...)
,这将启用多行模式,但这在这里甚至没有必要。相反,您可以^
从规则的开头删除,它会按您的意愿工作。由于您的两个规则始终与整行匹配,因此下一个标记将始终从该行的开头开始 - 无需锚定它们。
添加回答
举报
0/150
提交
取消