或运算符内部或运算符RegEX

2024-09-27 07:25:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用python创建一个编译器,并使用re模块来创建标记。语言将非常类似于Assembly。在

几乎所有的东西都在工作,但我遇到了一个问题。让我举个例子来说明这个代币是什么:

mov [eax], 4
mov [name],2
mov eax, [ebx]

Tokens: [eax], [ebx]

我可以用这个模式找到我想要的:\[(eax|ebx)\] 但我在使用其他模式时会出错,我相信这是因为“|”。在

^{pr2}$

错误:

^{3}$

有没有办法用另一个字符代替'|'?在


Tags: 模块name标记re语言编译器模式assembly
3条回答

您的心痛是由捕获组中的捕获组引起的,该组导致每个匹配的groups()调用返回一个5元组。不要使用捕获组,请尝试将非捕获组(语法:(?:pattern))混合到您的最终捕获组中,如下所示:

(\[(?:eax|ebx)\])

示例运行:

^{pr2}$

我的建议是在解包时忽略这个值。在

comment, memory_int, memory_hex, memory_reg, _ = match.groups()

或者:

^{pr2}$

问题不是因为中的|字符:

    |(\[(eax|ebx)\])             # memory access with registers

这是因为表达式的这一部分定义了两个捕获组,一个嵌套在另一个组中—因此match.groups()返回的值比解包的要多,例如第一行:

^{pr2}$

避免嵌套组的一种方法是使用:

    |(\[eax\]|\[ebx\])          # memory access with registers

这将导致返回:

(None, None, None, '[eax]')

正如@Shashank指出的,您还可以使用-capturing group(?:...)语法来定义嵌套的可能寄存器值模式:

    |(\[(?:eax|ebx)\])          # memory access with registers

达到同样的目的。当有更多的可能的子模式(而且它们更复杂)时,这种方法是有利的,因为否则你需要为每种可能性详细说明整个模式,而不是利用它们可能具有的一些共性。在

相关问题 更多 >

    热门问题