Python 正则表达式中的不平衡圆括号

Python 正则表达式中的不平衡圆括号,python,regex,expression,ply,Python,Regex,Expression,Ply,我正在用python中的ply构建一个lexer。我有两个令牌,分别称为TkConjuncion(表示逻辑and)和TkDisjuncion(表示逻辑and) 它们的规则如下(也有其他规则,但不相关): 其中\\/是\/,\/\\是/\。但当我测试代码时,它会说: 错误:规则“t_TkConjunction”的正则表达式无效。 不平衡括号 lexer将\读取为\,因此它接受t\u tkdisjunction,但我不明白它为什么不接受其他令牌。我一直在网上搜索,但什么也没找到 知道为什么会发生这种

我正在用python中的ply构建一个lexer。我有两个令牌,分别称为TkConjuncion(表示逻辑and)和TkDisjuncion(表示逻辑and)

它们的规则如下(也有其他规则,但不相关):

其中
\\/
\/
\/\\
/\
。但当我测试代码时,它会说:

错误:规则“t_TkConjunction”的正则表达式无效。 不平衡括号

lexer将
\
读取为
\
,因此它接受t\u tkdisjunction,但我不明白它为什么不接受其他令牌。我一直在网上搜索,但什么也没找到

知道为什么会发生这种情况吗?

我不知道,但我敢打赌,反斜杠的解释不止一个级别。Python在编译字符串文本时确实达到了一定的级别。您在示例中创建的实际字符串是

\/

如果
ply
继续在正则表达式中嵌入它们而不首先转义它们(这是我不知道的部分,但我认为很可能),那么第二个字符串中的尾随反斜杠将用于转义后面的内容。这可能是一个右括号,因此是一个“不平衡括号”投诉

无论如何,请尝试生成这些原始字符串:

t_TkDisjuncion = r'\\\/'
t_TkConjuncion = r'\/\\'
“r”前缀防止Python专门处理反斜杠,因此这些行创建的实际字符串是

\\\/

如果这些代码随后被嵌入到正则表达式中,而没有首先转义它们(这取决于
ply
,而不是取决于您),那么它们将按照您的意愿执行


编辑我很确定就是这样。查看
ply
文档,令牌确实是使用regexp指定的,文档建议使用原始字符串,因为这是为了避免我上面提到的反斜杠的双重解释。

是的!就这样!这就是厌倦事情的问题,谢谢你,我完全错过了它(尽管我在其他规则中使用了原始字符串)。
t_TkDisjuncion = r'\\\/'
t_TkConjuncion = r'\/\\'
\\\/
\/\\