我有一个很长的字符串,它可以由几个子字符串组成(不总是这样,有时是一个字符串,有时是4个子字符串粘在一起)。每个字符串都以字节长度开始,例如4D或4 E。下面是一个由4个子字符串组成的大字符串示例:
4D44B9096268182113077A95C84005D55FCD9D79476DDA4346C7EF1F4F07D4B46693F51812C8B74E4E44B9097368182113077A340040058D55E7E8D3924C57182F6E07A4D3617E100D1652169668636CB54E44B9096868182113077A37004005705FE9461E85F69A4C8E1B00CE03E6337B8F3D853A51C447B9694E44B9096668182113077AA400400555C9FAADA21F1EC93DBD5B579E4E07DDAF75A45D095E72010DBB
按模式拆分后,输出应为:
4D44B9096268182113077A95C84005D55FCD9D79476DDA4346C7EF1F4F07D4B46693F51812C8B74E
4E44B9097368182113077A340040058D55E7E8D3924C57182F6E07A4D3617E100D1652169668636CB5
4E44B9096868182113077A37004005705FE9461E85F69A4C8E1B00CE03E6337B8F3D853A51C447B969
4E44B9096668182113077AA400400555C9FAADA21F1EC93DBD5B579E4E07DDAF75A45D095E72010DBB
每个长字符串都有ID -在这个例子中是44 B 909,每一行在字节后面都有这个ID。我的原始代码取前6个字母(4D 44 B 9),并以此拆分字符串。它在95%的情况下都有效-其中每行都有相同的长度,例如4D。问题是并不总是每行都有相同的长度-就像上面的字符串一样。看看下面我的代码:
def repeat():
string = input('Please paste string below:'+'\n')
code = string[:6]
print('\n')
print('SPLITTED:')
string = string.replace(code, '\n'+'\n'+code)
print(string)
while True:
repeat()
当你试图粘贴这个长字符串时,它不会拆分它,因为第一行有4D,其余的有4 E。我想让它“忽略”(一会儿)前2个字母(4 E),并采取6个后续字母,作为“split-pattern”?输出应该是上面的这4行!我改变了一些代码,但我得到了一些奇怪的结果,如下所示:
44B9096268182113077A95C84005D55FCD9D79476DDA4346C7EF1F4F07D4B46693F51812C8B74E
44B9097368182113077A340040058D55E7E8D3924C57182F6E07A4D3617E100D1652169668636CB54E
44B9096868182113077A37004005705FE9461E85F69A4C8E1B00CE03E6337B8F3D853A51C447B9694E
44B9096668182113077AA400400555C9FAADA21F1EC93DBD5B579E4E07DDAF75A45D095E72010DBB
我怎样才能让它工作呢?
1条答案
按热度按时间2ledvvac1#
如果前两个字符以十六进制编码字符串的长度,为什么不用它来决定字符串的长度呢?4D是正确的(十进制78),但4 E显然应该是51(字符串长了4个字符)。
对于如何对稍微可变的模式进行拆分的问题,正则表达式似乎是一个很好的解决方案。
在这么多的话,这是说“使用4D或4 E作为分隔符,以分裂,但只有当它紧随44 B 909”。
(在第一个值之前会有一个空组,但这很容易转移;或将正则表达式更改为
r'(?<!^)4[DE](?=44B909O)'
。)如果不想丢弃任何内容,请将所有内容都包含在lookahead中: