Python正则表达式捕获短语?

标签 python regex

我想找出一个正则表达式模式,能够捕获操作以及它针对给定的汇编代码片段所作用的两个寄存器或地址。这是我到目前为止所拥有的:

import re

assembly_code = """
    lea    r8, [rcx + 8*rax]
    movsd  xmm0, qword ptr [rcx + 8*rax]   ## xmm0 = mem[0],zero
    mov    rcx, r9
    xor    edi, edi
    .p2align    4, 0x90
LBB0_12:                                ##   Parent Loop BB0_2 Depth=1
                                        ##     Parent Loop BB0_3 Depth=2
                                        ##       Parent Loop BB0_4 Depth=3
                                        ##         Parent Loop BB0_10 Depth=4
                                        ##           Parent Loop BB0_11 Depth=5
                                        ## =>          This Inner Loop Header: Depth=6
    movsd  xmm1, qword ptr [r13 + 8*rdi]   ## xmm1 = mem[0],zero
    mulsd  xmm1, qword ptr [rcx]
    addsd  xmm0, xmm1
    movsd  qword ptr [r8], xmm0
    add    rcx, 2048
    lea    r12, [rsi + rdi]
    add    r12, 1
    add    rdi, 1
    cmp    r12, r14
    jl     LBB0_12
## %bb.13:                              ##   in Loop: Header=BB0_11 Depth=5
    add    rax, 1
    add    r9, 8
    cmp    rax, rbx
    jl     LBB0_11
"""

pattern = r"\b(mov|movaps|movups|movaps|movss|movsd|movlps|movhps|movlpd|movhpd|movd|movq)\b\s+(\S+)\s*,\s*(\S+(\s*\[.*?\])?)"

matches = re.findall(pattern, assembly_code)
for match in matches:
    print("Instruction: ", match[0])
    print("Operand 1: ", match[1])
    print("Operand 2: ", match[2])
    print("---")

但输出如下所示:

Instruction:  movsd
Operand 1:  xmm0
Operand 2:  qword
---
Instruction:  mov
Operand 1:  rcx
Operand 2:  r9
---
Instruction:  movsd
Operand 1:  xmm1
Operand 2:  qword
---

我的目标是完整形式的 qword ptr [r13 + 8*rdi] 等模式。如何修改模式以使其正确捕获完整字符串?

最佳答案

对于第三组,我会使用类似 [^,#\n]+ 的内容与 [^not in class]一个或多个相匹配。一个lookbehind (?<! )可以防止以空格结束或使用 e.g. [^,#\n]*[^\s,#] 或者。

\b(mov(?:aps|ups|aps|ss|sd|lps|hps|lpd|hpd|d|q)?) +(\w+) *, *([^,#\n]+(?<! ))

See this demo at regex101Python demo - 使用[ \t]而不是 可以出现制表符的位置。

进一步做了一些更改,例如缩短模式、使用 \w第二组中的单词字符,删除 \b\s+ 中的单词边界它看起来多余( \s 已经需要单词结束)。

关于Python正则表达式捕获短语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76082604/

相关文章:

c# - 如何找到两个已知值之间的所有字符串?

c# 正则表达式拆分二进制字符串

python - celery 节拍时间表 : run task instantly when start celery beat?

python - 转换格式为 mm :ss to a time format pandas 的对象数据类型列

python - 在不运行 eval 的情况下获取可迭代的张量

python - 正则表达式 Python

java - 正则表达式忽略不同行上两个字符之间的字符

python - 使用 pandas 应用

python - TKinter GUI,如何使帧的大小正确?

c# - 解析 Lucene 查询语法并转义 CloudSearch