заменить или удалить один ноль (питон) - PullRequest
0 голосов
/ 17 ноября 2009

Я хотел бы удалить один нулевой байт в строке, а иногда заменить его другим символом. Вот так:

string = "41 00 36 00 36 00 00 00 57 00 46 00 42 00 41 00 61 00 62 00 73 00 20 00 36 00"

Я думал об использовании random и replace, но всегда начинаю замену с первого:

replace("00","B",1)

Так что это не случайно.

Любая помощь будет оценена!

РЕДАКТИРОВАТЬ: я имел в виду ноль под 00, и я сделал ошибку:

string = "41 00 36 00 36 00 00 00 57 00 46 00 42 00 41 00 61 00 62 00 73 00 20 00 36 00"

Спасибо

Ответы [ 4 ]

7 голосов
/ 17 ноября 2009

Не только это, но 00 не является «нулевым» в любом воображении - это строка из 2 символов. Похоже, вы молча предполагаете, что ваша строка состоит из подстрок, каждая из которых состоит из двух шестнадцатеричных цифр, и любая выполняемая вами строковая операция не будет иметь представления об этом вашем небольшом частном соглашении - если вам удастся «заменить случайную 00» на нее вполне может быть одна, состоящая из второй цифры, скажем, «F0», за которой следует первая цифра, скажем, «03»: не то, что вы, вероятно, имеете в виду!

Логически более чистый подход заключается в том, чтобы сначала разбить вашу строку на 2-значные части, что сделает ваше невысказанное предположение ясным и явным:

>>> string = "4100360036000000570046004200410061006200730020003600"
>>> pieces = [string[i:i+2] for i in range(0, len(string), 2)]
>>> pieces
['41', '00', '36', '00', '36', '00', '00', '00', '57', '00', '46', '00', '42', '00', '41', '00', '61', '00', '62', '00', '73', '00', '20', '00', '36', '00']
>>> 

Да, это можно сделать намного более кратким, но я стремлюсь к ясности и концептуальной четкости здесь! -).

Теперь найдите все цифры «00»:

>>> where0s = [i for i in range(len(pieces)) if pieces[i] == '00']
>>> where0s
[1, 3, 5, 6, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25]

(опять же, легко сделать компакт, но это самый ясный способ; -).

Теперь получите случайный выбор из where0s и либо удалите его, либо замените его, например, 'BA', затем присоединитесь к строке:

>>> import random
>>> pickone = random.choice(where0s)
>>> pickone
25
>>> # if replacing:
... 
>>> pieces[pickone] = 'BA'
>>> ''.join(pieces)
'41003600360000005700460042004100610062007300200036BA'
>>> # if removing:
... 
>>> del pieces[pickone]
>>> ''.join(pieces)
'41003600360000005700460042004100610062007300200036'
>>> 

Если это действительно именно та операция, которую вы хотите выполнить, но вам нужна большая краткость и скорость, а не полная ясность, мы, конечно, можем продолжать развивать идею!

1 голос
/ 17 ноября 2009

Гадкий код, протестированный в Python 3.1.1

import random
s = "a00b00c00d00e00f00g"
s1 = s.split("00")
i = random.randint(1,s.count("00"))
s2 = "00".join(s1[:i])
s3 = "00".join(s1[i:])
print (s2+"EE"+s3)
0 голосов
/ 17 ноября 2009

Нельзя заменить байты в строке. Вместо этого вы хотите использовать массив для этого.

import array
s = "4100360036000000570046004200410061006200730020003600"
a = array.array('c',s)
b = array.array('c',"B") # make a one character array containing B
print a
a[6] = b[0]
print b

Конечно, если вы предполагаете, что это шестнадцатеричные коды для символов, вам потребуется использовать функции hex () и chr () для преобразования между целыми числами и строками шестнадцатеричных символов.

0 голосов
/ 17 ноября 2009

Это решение захватывает все возможные местоположения "00" для четных значений строки и выбирает одно случайное. Это должно решить вашу проблему:

from random import choice

string = "4100360036000000570046004200410061006200730020003600"

zeroes = []

for i, s in enumerate(string):
    if i % 2 == 0 and i < len(string) - 1 and string[i:i + 2] == "00":
        zeroes.append(i)

c = choice(zeroes)
string = string[:c] + '0B' + string[c + 2:]
print string
...