Python 带有变量数据的正则表达式-ply.lex

Python 带有变量数据的正则表达式-ply.lex,python,lexer,ply,Python,Lexer,Ply,我正在使用python模块ply.lex编写一个lexer。我用正则表达式指定了一些标记,但现在我卡住了。我有一个关键字列表谁应该是标记数据是一个包含大约1000个关键字的列表,这些关键字都应被识别为一种关键字。例如:\u Function1\u UDFType2等等。列表中的所有单词都用空格隔开,就是这样。我只想让lexer识别这个列表中的单词,这样它就会返回一个'KEYWORD'类型的标记 data = 'Keyword1 Keyword2 Keyword3 Keyword4' def t_

我正在使用python模块
ply.lex
编写一个lexer。我用正则表达式指定了一些标记,但现在我卡住了。我有一个
关键字列表
谁应该是
标记
<代码>数据是一个包含大约1000个关键字的列表,这些关键字都应被识别为一种关键字。例如:
\u Function1\u UDFType2
等等。列表中的所有单词都用空格隔开,就是这样。我只想让lexer识别这个列表中的单词,这样它就会返回一个'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)
所以我试图将变量添加到正则表达式中,但没有成功。我总是得到:
没有为规则“t\u关键字”定义正则表达式。

提前谢谢你!
John

ply.lex使用docstring作为正则表达式。请注意,您定义标记的顺序定义了它们的优先级,这通常对管理非常重要

顶部的docstring不能是表达式,因此需要逐个标记定义此标记

我们可以在解释器中测试这一点:

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

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

正如@DSM建议的那样,您可以。查找标记(如
cat
dog
的正则表达式是
'cat | dog'
(即,用
'|'
分隔的单词,而不是空格)。因此,请尝试:


您使用了什么代码将其添加到正则表达式中(显示实际引发错误的代码),我仍然不明白。那一行被注释掉了。你能给出一个实际抛出该错误的示例吗?我们只需使用上面或这里的代码:
data='Keyword1 Keyword2 Keyword3 Keyword4'def t\u KEYWORD(t):r'\$'+data return t
该代码不会抛出异常。在正则表达式中实际使用
t\u关键字的那一行在哪里?好的,让我们备份一下
ply
已经有了一个装饰器--
TOKEN
--来完成人们建议的一些文档字符串魔术。例如,见。但是我不确定您是否想要构造4个单独的标记并分别识别它们(这无论如何都不会实现),或者您是否有一个包含四个变体的关键字,或者是什么。你能把你的帖子编辑得更具体一点吗?你能定义一个空函数,并修改
f.\uuu doc\uuu='my'+'regex'
?嗯,我有大约1000个关键字,不可能通过令牌定义来定义
令牌定义
@JohnSmith更新了一个可能的修复!这应该行得通,请尝试一下。我已经尝试过:
def t_关键字(t):返回t_关键字。func_doc=r'\d+'
,但仍然有些错误error@JohnSmith似乎ply.lex会立即读取docstring,甚至可能是在运行时:但我问了。
from ply.lex import TOKEN
data = data.split() #make data a list of keywords

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