为了账号安全,请及时绑定邮箱和手机立即绑定

Python lex - 类型错误:未知文本

Python lex - 类型错误:未知文本

慕码人8056858 2021-11-30 19:19:36
我正在尝试编写一个简单的 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:...),这将启用多行模式,但这在这里甚至没有必要。相反,您可以^从规则的开头删除,它会按您的意愿工作。由于您的两个规则始终与整行匹配,因此下一个标记将始终从该行的开头开始 - 无需锚定它们。


查看完整回答
反对 回复 2021-11-30
  • 1 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信