#python #string #formatting
#питон #строка #форматирование
Вопрос:
У меня есть текст, который выглядит так:
0x00000000 ebc4 jmp 0x-0000003a 0 0x00000002 30b9aaad03f0 xor byte [ecx - 268194390],bh 2 0x00000008 bcebd9b87a mov esp,0x7ab8d9eb 8 0x0000000d b182 mov cl,130 13 0x0000000f 3bbd98607e3c cmp edi,dword [ebp 1014915224] 15 0x00000015 3229 xor ch,byte [ecx] 21 0x00000017 3c01 cmp al,1 23 0x00000019 25040bbe7d and eax,0x7dbe0b04 25 0x0000001e 13fd adc edi,ebp 30 0x00000020 b48d mov ah,141 32 0x00000022 af scasd 34 0x00000023 2f das 35 0x00000024 34a4 xor al,164 36 0x00000026 02929d1302a3 add dl,byte [edx - 1560144995] 38 0x0000002c 9c pushfd 44 0x0000002d 90 nop 45 0x0000002e 90 nop 46 0x0000002f 90 nop 47
Я хочу отформатировать мнемонику в строке (3-я позиция) так, чтобы она находилась на одинаковом расстоянии от вызова (2-я позиция), независимо от того, насколько велик вызов. Например:
0x00000000 ebc4 jmp 0x-0000003a 0 0x00000002 30b9aaad03f0 xor byte [ecx - 268194390],bh 2 0x00000008 bcebd9b87a mov esp,0x7ab8d9eb 8 0x0000000d b182 mov cl,130 13
Вышесказанное является прекрасным примером того, что мне нужно было бы сделать. Я пробовал использовать методы форматирования строк , такие как "{} {:lt;10} {:gt;10} {}n"
, однако это выглядит не совсем так, как я ожидал бы, это тоже выглядит примерно так:
0x00000000 ebc4 jmp 0x-0000003a 0 0x00000002 30b9aaad03f0 xor byte [ecx - 268194390],bh 2 0x00000008 bcebd9b87a mov esp,0x7ab8d9eb 8 0x0000000d b182 mov cl,130 13 0x0000000f 3bbd98607e3c cmp edi,dword [ebp 1014915224] 15 0x00000015 3229 xor ch,byte [ecx] 21 0x00000017 3c01 cmp al,1 23 0x00000019 25040bbe7d and eax,0x7dbe0b04 25 0x0000001e 13fd adc edi,ebp 30 0x00000020 b48d mov ah,141 32 0x00000022 af scasd 34 0x00000023 2f das 35 0x00000024 34a4 xor al,164 36 0x00000026 02929d1302a3 add dl,byte [edx - 1560144995] 38 0x0000002c 9c pushfd 44 0x0000002d 90 nop 45 0x0000002e 90 nop 46 0x0000002f 90 nop 47
Как я могу динамически изменять форматирование каждой строки, чтобы мнемоника инструкций находилась в одной области для каждой строки, чтобы улучшить читаемость?
Комментарии:
1. Вы можете указать ширину формата динамически, например
f"{mystring:lt;{width}}"
, если это поможет, как только вы рассчитаете ширину (в переменнойwidth
в этом примере).
Ответ №1:
Это будет формат a line
, как вы просили:
"%s %-12s %s" % tuple(line.split(' ',2))
Ответ №2:
Вот решение с петлями:
s = "0x00000000 ebc4 jmp 0x-0000003a 0n0x00000002 30b9aaad03f0 xor byte [ecx - 268194390],bh 2n0x00000008 bcebd9b87a mov esp,0x7ab8d9eb 8n0x0000000d b182 mov cl,130 13n0x0000000f 3bbd98607e3c cmp edi,dword [ebp 1014915224] 15n0x00000015 3229 xor ch,byte [ecx] 21n0x00000017 3c01 cmp al,1 23n0x00000019 25040bbe7d and eax,0x7dbe0b04 25n0x0000001e 13fd adc edi,ebp 30n0x00000020 b48d mov ah,141 32n0x00000022 af scasd 34n0x00000023 2f das 35n0x00000024 34a4 xor al,164 36n0x00000026 02929d1302a3 add dl,byte [edx - 1560144995] 38n0x0000002c 9c pushfd 44n0x0000002d 90 nop 45n0x0000002e 90 nop 46n0x0000002f 90 nop 47" lines = s.split("n") split_lines = [line.split() for line in lines] new_lines = [split[0] " " split[1] for split in split_lines] for i, line in enumerate(new_lines): while len(line) lt; 24: line = " " line = split_lines[i][2] " " split_lines[i][3] new_lines[i] = line for line in new_lines: print(line)
Выход:
0x00000000 ebc4 jmp 0x-0000003a 0x00000002 30b9aaad03f0 xor byte 0x00000008 bcebd9b87a mov esp,0x7ab8d9eb 0x0000000d b182 mov cl,130 0x0000000f 3bbd98607e3c cmp edi,dword 0x00000015 3229 xor ch,byte 0x00000017 3c01 cmp al,1 0x00000019 25040bbe7d and eax,0x7dbe0b04 0x0000001e 13fd adc edi,ebp 0x00000020 b48d mov ah,141 0x00000022 af scasd 34 0x00000023 2f das 35 0x00000024 34a4 xor al,164 0x00000026 02929d1302a3 add dl,byte 0x0000002c 9c pushfd 44 0x0000002d 90 nop 45 0x0000002e 90 nop 46 0x0000002f 90 nop 47