【问题标题】:RegEx with variable data in it - ply.lex带有可变数据的正则表达式 - ply.lex
【发布时间】:2012-08-31 14:50:31
【问题描述】:

我正在使用 python 模块ply.lex 编写一个词法分析器。我得到了一些用正则表达式指定的标记,但现在我卡住了。我有一个list of Keywords,应该是tokendata 是一个包含大约 1000 个关键字的列表,这些关键字都应该被识别为一种关键字。例如:_Function1 _UDFType2 等等。列表中的所有单词都由空格分隔,就是这样。我只想让词法分析器识别此列表中的单词,以便它返回类型为“KEYWORD”的标记。

data = 'Keyword1 Keyword2 Keyword3 Keyword4'
def t_KEYWORD(t):
    # ... r'\$' + data ??
    return t

text = '''
Some test data


even more

$var = 2231




$[]Test this 2.31 + / &
'''

autoit = lex.lex()
autoit.input(text)
while True:
    tok = autoit.token()
    if not tok: break
    print(tok)

所以我试图将变量添加到该正则表达式,但它没有工作。我总是开始: No regular expression defined for rule 't_KEYWORD'.

提前感谢您! 约翰

【问题讨论】:

  • 您使用什么代码将其添加到正则表达式(显示实际引发错误的代码)
  • 我还是没跟上。该行已被注释掉。你能展示一个实际引发该错误的示例吗?
  • 好吧,只需使用上面或此处的代码:data = 'Keyword1 Keyword2 Keyword3 Keyword4' def t_KEYWORD(t): r'\$' + data return t
  • 该代码不会引发异常。正则表达式中实际使用t_KEYWORD 的行在哪里?
  • 好的,让我们备份一下。 ply 已经有一个装饰器 -- TOKEN -- 来做一些人们建议的文档字符串魔法。例如,请参阅here。但是我不确定您是否要构建 4 个单独的标记并分别识别它们中的每一个(这无论如何都不会这样做),或者您是否有一个具有四个变体的关键字,或者什么。你能把你的帖子编辑得更具体一点吗?

标签: python lexer ply


【解决方案1】:

正如@DSM 建议的那样,您可以使用TOKEN decorator。查找 catdog 之类的标记的正则表达式是 'cat|dog'(即,由 '|' 分隔的单词而不是空格)。所以试试:

from ply.lex import TOKEN
data = data.split() #make data a list of keywords

@TOKEN('|'.join(data))
def t_KEYWORD(t):
    return t

【讨论】:

    【解决方案2】:

    ply.lex 使用正则表达式的文档字符串。 请注意,您定义令牌的顺序定义了它们的优先级,这通常很重要。

    .

    顶部的docstring不能是表达式,所以需要逐个token定义来做这个token定义。

    我们可以在解释器中进行测试:

    def f():
        "this is " + "my help"  #not a docstring :(
    f.func_doc #is None
    f.func_doc = "this is " + "my help" #now it is!
    

    因此这应该可以工作:

    def t_KEYWORD(token):
        return token
    t_KEYWORD.func_doc=r'REGULAR EXPRESSION HERE' #can be an expression
    

    【讨论】:

    • 能否定义一个空函数,并修改f.__doc__ = 'my' + 'regex'
    • 嗯,我有大约 1000 个关键字,不可能做到token definition by token definition
    • @JohnSmith 更新了一个可能的修复程序!这应该有效,请试一试。
    • 我试过了:def t_KEYWORD(t): return t t_KEYWORD.func_doc=r'\d+' 但还是有一些错误
    • @JohnSmith 似乎 ply.lex 会立即读取文档字符串,甚至可能在运行时:但我问过this question
    【解决方案3】:

    不确定这是否适用于 ply,但文档字符串是函数的 __doc__ 属性,因此如果您编写一个接受字符串表达式并将其设置为函数 ply 的 __doc__ 属性的装饰器,则可能会使用它.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-28
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      相关资源
      最近更新 更多