gpt4 book ai didi

python - 奇怪的行为正则表达式

转载 作者:太空宇宙 更新时间:2023-11-03 13:41:27 25 4
gpt4 key购买 nike

我正在编写一个程序来从汇编中的源代码生成 token ,但我遇到了一个奇怪的问题。

有时代码会按预期工作,有时却不会!

这是代码(变量是葡萄牙语,但我翻译了):

import re

def tokenize(code):
tokens = []

tokens_re = {
'comentarios' : '(//.*)', # comentary
'linhas' : '(\n)', # lines
'instrucoes' : '(add)', # instructions
'numeros_hex' : '([-+]?0x[0-9a-fA-F]+)', # hex numbers
'numeros_bin' : '([-+]?0b[0-1]+)', # binary numbers
'numeros_dec' : '([-+]?[0-9]+)'} # decimal numbers

#'reg32' : 'eax|ebx|ecx|edx|esp|ebp|eip|esi',
#'reg16' : 'ax|bx|cx|dx|sp|bp|ip|si',
#'reg8' : 'ah|al|bh|bl|ch|cl|dh|dl'}

pattern = re.compile('|'.join(list(tokens_re.values())))
scan = pattern.scanner(code)

while 1:
m = scan.search()
if not m:
break

tipo = list(tokens_re.keys())[m.lastindex-1] # type
valor = repr(m.group(m.lastindex)) # value

if tipo == 'linhas':
print('')

else:
print(tipo, valor)

return tokens



code = '''
add eax, 5 //haha
add ebx, -5
add eax, 1234
add ebx, 1234
add ax, 0b101
add bx, -0b101
add al, -0x5
add ah, 0x5
'''

print(tokenize(code))

这里是预期的结果:

instrucoes 'add'
numeros_dec '5'
comentarios '//haha'

instrucoes 'add'
numeros_dec '-5'

instrucoes 'add'
numeros_dec '1234'

instrucoes 'add'
numeros_dec '1234'

instrucoes 'add'
numeros_bin '0b101'

instrucoes 'add'
numeros_bin '-0b101'

instrucoes 'add'
numeros_hex '-0x5'

instrucoes 'add'
numeros_hex '0x5'

问题是代码没有变化,有时它会给出预期的结果,但有时是这样的:

instrucoes 'add'
numeros_dec '5'
comentarios '//haha'

instrucoes 'add'
numeros_dec '-5'

instrucoes 'add'
numeros_dec '1234'

instrucoes 'add'
numeros_dec '1234'

instrucoes 'add'
numeros_dec '0'
numeros_dec '101'

instrucoes 'add'
numeros_dec '-0'
numeros_dec '101'

instrucoes 'add'
numeros_dec '-0'
numeros_dec '5'

instrucoes 'add'
numeros_dec '0'
numeros_dec '5'

问题出在哪里?

最佳答案

您从字典构建正则表达式。字典没有排序,因此正则表达式模式可能会不时发生变化,从而产生不同的结果。

如果您想要“稳定”的结果,我建议您使用 sorted(tokens_re.values()) 或在列表/元组而不是字典中指定它们。

例如,您可以将它们指定为成对列表,然后使用该列表构建模式以及构建字典:

tokens_re = [
('comentarios', '(//.*)'), # comentary
('linhas', '(\n)'), # lines
('instrucoes', '(add)'), # instructions
('numeros_hex', '([-+]?0x[0-9a-fA-F]+)'), # hex numbers
('numeros_bin', '([-+]?0b[0-1]+)'), # binary numbers
('numeros_dec', '([-+]?[0-9]+)'), # decimal numbers
]
pattern = re.compile('|'.join(p for _, p in tokens_re))
tokens_re = dict(tokens_re)

关于python - 奇怪的行为正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30438402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com