python - 如何使用正则表达式匹配 asm 文件中的标签和指令
问题描述
我正在尝试使用正则表达式从 python 中的 asm 文件中提取标签和包含的指令。
汇编代码,
.data
numOne: .word 10
numTwo:
.word 20
.text
.globl main
main:
lw $s1 , 0($s0)
lw $s2, 4($s0)
add $s3, $s1, $s2
lw $s2,numOne
jr $ra
foo:
add $s3, $s1, $s2
jr $ra
在这种情况下,标签是“main”和“foo”,然后是每个标签中的说明
这是我定义的标签的模式,
label_pattern = re.compile(
r"(\w+:)(\s*\w{2,3}\s*(\$[a-z0-9]{2}\s*,?\s*){1,3}(\d+\(\$[a-z][0-9]\))*)+\n?")
我无法lw $s2,numOne
使用此模式在 asm 文件中匹配(第 12 行)。输出如下,
main:
lw $s1 , 0($s0)
lw $s2, 4($s0)
add $s3, $s1, $s2
lw $s2,
foo:
add $s3, $s1, $s2
jr $ra
我尝试修改正则表达式以匹配单词,
label_pattern = re.compile(
r"(\w+:)(\s*\w{2,3}\s*(\$[a-z0-9]{2}\s*,?\s*){1,3}(\d+\(\$[a-z][0-9]\))*\w*)+\n?")
但我没有得到我想要的结果。
main:
lw $s1 , 0($s0)
lw $s2, 4($s0)
add $s3, $s1, $s2
lw
foo:
add $s3, $s1, $s2
jr
请纠正我。谢谢你。
编辑:为了澄清,我试图将指令存储在字典中,其中标签作为键,指令列表作为值。
这是我用来检查输出的代码
import re
label_pattern = re.compile(
r"(\w+:)(\s*\w{2,3}\s*(\$[a-z0-9]{2}\s*,?\s*){1,3}(\d+\(\$[a-z][0-9]\))*\w*)+\n?")
test_pattern = re.compile(
r"\s*\w{2}\s*\$[a-z][0-9]\s*,\s*(\d+\(\$[a-z][0-9]\))*\w+\s*"
) # this pattern matches the instruction lw $s2, numOne
f = open("instructionTest.asm", "r") # instructionTest.asm refers to the above asm code
matches = label_pattern.finditer(f.read())
for match in matches:
if match:
print(match.group())
我期待以下输出,其中包含标签和其中包含的说明。
main:
lw $s1 , 0($s0)
lw $s2, 4($s0)
add $s3, $s1, $s2
lw $s2,numOne
jr $ra
foo:
add $s3, $s1, $s2
jr $ra
编辑 2:请求重新打开此问题以获得可能更好的解决方案
解决方案
您没有得到预期的输出,因为除了空格和其他空白字符之外的匹配项,因此\s
在输入之后使用换行符,并且以下内容与下一行的指令匹配,从而干扰了进一步的匹配。
如果我们用 替换这些序列,我们会得到预期的输出:\t
\n
(\$[a-z0-9]{2}\s*,?\s*)
add $s3, $s1, $s2
\w*
label_pattern
lw
\s
[ \t]
r"(\w+:)(\s*\w{2,3}\s*(\$[a-z0-9]{2}[ \t]*,?[ \t]*){1,3}(\d+\(\$[a-z][0-9]\))*\w*)+\n?")
推荐阅读
- javascript - 搜索栏:包含在列表项标签中的锚标签不可选择
- python - 将变量提供给 SQL 语句的 Python 问题。cur.execute(None, {'id': test}) cx_Oracle.DatabaseError: ORA-00911: 无效字符
- neo4j - 如何在neo4j中使用每个路径的路径ID导出数据
- azure-active-directory - 尝试使用 Msal 从控制台应用程序访问 Web API 时出现 MsalServiceException:'AADSTS501461
- scala - 具有上限值的案例类 .copy
- c++ - 获取依赖类型的可变参数模板参数包
- android - 添加了 android 变量和 Glide 的 URL
- riak - Riak 中 node_gets 和 vnode_gets 的区别
- python - 如何将数据保存到 .txt 文件中而不是创建新文件(Python)
- http - 当从 HTTPS 更改为 HTTP 时,如何让 Jenkins 不要求重新登录?