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