python 按特殊模式拆分字符串

n1bvdmb6  于 2023-02-15  发布在  Python
关注(0)|答案(1)|浏览(180)

我有一个很长的字符串,它可以由几个子字符串组成(不总是这样,有时是一个字符串,有时是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

我怎样才能让它工作呢?

2ledvvac

2ledvvac1#

如果前两个字符以十六进制编码字符串的长度,为什么不用它来决定字符串的长度呢?4D是正确的(十进制78),但4 E显然应该是51(字符串长了4个字符)。
对于如何对稍微可变的模式进行拆分的问题,正则表达式似乎是一个很好的解决方案。

import re

splitted = re.split(r'4[DE](?=44B909)', string)

在这么多的话,这是说“使用4D或4 E作为分隔符,以分裂,但只有当它紧随44 B 909”。
(在第一个值之前会有一个空组,但这很容易转移;或将正则表达式更改为r'(?<!^)4[DE](?=44B909O)'。)
如果不想丢弃任何内容,请将所有内容都包含在lookahead中:

splitted = re.split(r'(?<!^)(?=4[DE]44B909)', string)

相关问题