在两个字符串中查找相同的序列

时间:2016-06-26 10:50:53

标签: python sequence

我有两组十六进制数据:

01 9b 09 45 00 00 b1 21 b1 2e 56 58 16 b9 bb 57 a1 cb 14 5f 66 33 fc 8e 22 6b 78 d9 d0 0f 06 e8 14 ee e5 66 57 75 f4 fe ca 23 5d 17 40 c7 f8 a7 f8 6b c9 e5 64 0c d7 1b 6e cf 76 31 50 03 6f 5b 14 78 90 bf d1 55 47 60 41 a8 f6 40 d6 59 ff 38 76 80 f9 83 db f8 a6 e5 d1 77 14 59 c7 d7 51 5c b9 0e 1a ed c2 d7 6b cf 9c f1 8a 64 d1 c9 73 30 9d 11 f7 b6 ff b3 99 b3 dc 34 00 16 5d 56 7d e6 80 6d d7 e6 aa 4c c2 2f b5 e7 97 16 21 9c 36 fa 98 3a d4 e4 e7 ce d7 b7 a9 b7 57 82 dc 4a 23 32 c8 b1 17 ac 0c 88 b2 c3 4d 52 52 e4 b1 25 6a 2d e9 a5 7d 19 32 c3 57 b9 59 35 c3 fa 85 01 52 62 61 7e 71 33 70 22 e1 e9 8b d9 73 77 8b 74 57 7a f6 a0 14 e8 2d 9b e2 26 ff 05 05 c0 fe 31 66 2e de ab ff 67 53 94 9e 33 23 8e d5 7e 99 7a f4 0a 26 58 56 50 19 91 88 6d 54 79 46 94 c0 ca 0b 19 b8 69 a2 d0 e5 dd 55 09 b9 5f c7 d8 20 fc 77 8e 69 21 93 85 2d 68 58 ff 04 0e c6 ce 2f d7 62 f1 08 48 c3 98 31 49 3d 2a 8e 0b 8a fb 3c e7 85 be de f9 dc 4e 01 cc ac af a3 87 a2 83 09 16 7b 7b 38 ba 7c 25 52 6b ad e0 10 f4 c9 de 19 d5 63 37 0c c7 64 56 3e f0 e2 39 74 e2 c1 0d e5 37 9c 18 a4 bb 72 d6 d3 7c 16 22 95 93 a8 ca 9c 61 ac 48 ad 0a 8b 26 ba 03 e8 2d 35 88 e4 95 fe c8 77 bf 59 65 d5 12 33 52 12 33 9e 69 ae 22 50 b9 39 ab 6f 00 27 ae 58 e7 ed d9 ac 9e 38 c9 ee bc a9 0d 4c 20 8f c1 ea 0d 21 97 12 10 3f bd 10 9a 9b b5 dc a3 83 9c d7 24 9e 3e 9b 52 6d 17 82 0e 32 8e 42 7c c5 ab 7b eb 4f 20 a3 03 a0 a2 33 d2 6e 68 24 a8 90 d8 ef ba b0 f6 82 0d 5f 14 81 de 1b c0 1f f4 9b 1b 7e 27 1d c6 05 cd 32 02 b7 09 4b 85 60 36 4c 63 60 1b 98 f8 8b 53 e5 78 60 bc d7 24 11 aa 0e f0 98 39 0a 57 ed 9d f4 b5 70 fe 88 20 f2 40 50 e7 9d 6f a0 a6 64 72 19 d5 ed 4c 35 0d 6b a6 74 a8 df b7 9c 01 56 0e ca 12 2e ca d0 12 7e 5d f6 2a 54 5e 0d 61 82 fe 99 8a 81 e3 56 a1 8f cf 4c d5 08 eb 50 d3 1a a4 de a3 fd 73 f8 9b ae 94 14 45 cd 0a 62 5c fb c3 86 7f 5d c8 95 42 7b a1 4b 19 59 71 1f 61 08 db 41 3a 71 ff 21 36 4c d4 4c 54 16 35 6d cd 92 15 14 3e 85 b9 02 69 d6 e5 ef 92 bb bb 98 23 d1 86 c6 10 13 b1 c4 82 3d 84 a7 9b 39 9a a7 51 b9 a1 39 56 e7 28 d6 a2 9e 00 2c cd a6 66 fa 5c bb 76 02 7c 5b f2 97 32 79 d4 fa 3b 82 ba 89 c6 9b b0 46 58 f6 a1 25 b2 d1 0a d6 84 c1 ab 01 00 a8 54 9d cb dc 80 f4 9d

01 9b 09 45 00 00 4a 4e d2 73 90 d1 ff 21 37 6e dc b5 c8 97 ea 27 df 8d 37 a2 ff e1 c0 fc 6b 2d 53 63 1c a7 73 06 34 ff 1b b5 23 36 98 1e ca 4e bf 13 67 b5 ea f0 57 7f 06 73 57 12 8d 9a e0 27 63 75 7a 5e 82 9c bf 3b fd d0 57 2d 6e 0b 15 85 de fd f6 ee e6 34 77 59 29 5e 1d fe ab 22 ed 32 ec c6 2c 90 3c 50 7f 38 4c 4b f9 07 e0 81 bd 9a e4 46 60 24 32 ff cd 7c 42 ee 94 98 c2 74 10 5d b7 39 a9 6f 83 6e 6b 94 71 a9 33 e7 58 0d d7 9f fc 1f 01 3c 92 aa 0b 96 7f 21 a4 26 1b b7 00 e2 ed 7d 63 1c 7a 7d 1b 5b 11 71 40 3e 38 d1 e0 16 74 a8 07 3b 0e 99 e5 03 79 a2 60 e3 52 1d c5 c2 45 cb a1 10 20 d5 64 e1 de 4b d2 2f 0d 5c a9 89 9a f0 26 41 ec 63 61 e8 89 fc b8 05 c4 3c 3a 11 bc 9d 14 22 9b 43 82 c3 d5 bf d0 44 aa 2f 0e f5 9b 4c ae 5a e6 c4 1a da cd e6 d1 fc 10 60 a6 22 6d 4c 4d dd 19 19 6d 72 91 41 64 6b a8 b1 16 ec 99 17 3a 66 f0 b7 21 ba 83 ae 0e 62 f3 04 38 a1 79 5b 89 14 a3 25 2e 02 33 fd b3 98 d7 d0 3e 20 dc aa 09 32 87 b8 77 e4 24 1c 1c b9 f2 7a 2b c6 ce ae 0a 50 03 30 92 96 62 82 a3 b4 1a 0a 46 5e 18 79 1b 1b be d8 23 e9 20 53 79 12 fa 6b db ab 75 f4 48 45 79 b5 fe 93 70 d1 c8 c4 40 3c 77 10 e6 5f 1b cc d7 69 29 22 f3 ea ba bc 9f f0 3f da 72 a5 86 ac 67 f1 4a f6 be 9b 40 ee d0 e1 07 93 14 09 38 16 48 0c 60 80 4a 60 94 b6 64 f7 9c f3 71 50 c7 b8 75 a2 67 67 34 f5 8c fa 56 0c cc 73 37 ed b5 c9 86 e4 86 56 68 4c a3 01 b8 67 4c 90 8f e8 b6 1b 35 e4 06 31 7d 26 c5 7d bf 51 ec fc ef 82 dd b7 2b f9 1b cf e5 ad 87 7a 56 c4 43 90 f3 c1 25 a8 a7 38 87 aa dc 2d 4a 58 bf da 06 9f 6c 15 6a 70 c6 18 ad 3c d8 b6 23 e5 54 35 fd 4b 90 a7 44 de 84 4e 15 75 3b 85 1e ae 20 c5 13 f7 a6 4c 63 67 56 f1 16 48 82 4c 0d 47 f1 78 ca 59 ca 67 ee 1d be cb b9 fc 59 53 9f f0 50 21 31 4b 23 d2 02 7c 4a 7d 76 a9 05 b3 b0 5a d3 d2 08 54 42 18 b3 65 83 c9 2e 74 7e bc 03 f1 c0 f1 95 7e 68 a9 7c fc 07 b7 ba ff 7d 60 bd 7d b3 6b 0d 7e 40 4b b1 16 83 cb cd 33 1e b7 94 d0 d7 a3 ab 5e 29 66 f6 a7 91 09 f3 f1 a5 c1 78 b7 4f af 2a 55 1d cb b5 70 b0 68 44 2a fa fb e9 ff 62 0d ac 66 c7 4f 81 b8 4b ee 0c df d7 8e e1 b2 42 35 8a db 6b 04 5d 0d da 06 b1 3f da 74 cc e0 ec ca a7 e2 23 3a 14 ad 39 a9 14 20 d3 04 55 d6 eb db 0d d2 18 f8 02 ae 8b 45 c5 ef 69 82 7c 8e f7 10 71 b7

正如您所看到的,前6个字节按顺序匹配:

01 9b 09 45 00 00

使用Python,我如何在这两组中找到所有匹配的序列?它发生在哪里并不重要,只要它们在两个文件中都遵循相同的顺序。

我想我会遍历第一组,然后在第二组中找到匹配的字符,如00。如果找到匹配项,则查看下一个是否与集合1中的匹配项相同。如果是,请查找第三个其他跳过,并尝试循环中的下一个char。

for idx1, i in enumerate(set_1.split(" ")):
    for idx2, ii in enumerate(set_2.split(" ")):
        if i == ii:
            try:
                match = " ".join((i, set_1.split(" ")[idx1 + 1]))
                print match
            except:
                pass

你怎么走得更深?

3 个答案:

答案 0 :(得分:1)

a = "01 9b 09 45 00 00 b1 21 b1 2e 56 58 16 b9 bb 57 a1 cb 14 5f 66 33 fc 8e 22 6b 78 d9 d0 0f 06 e8 14 ee e5 66 57 75 f4 fe ca 23 5d 17 40 c7 f8 a7 f8 6b c9 e5 64 0c d7 1b 6e cf 76 31 50 03 6f 5b 14 78 90 bf d1 55 47 60 41 a8 f6 40 d6 59 ff 38 76 80 f9 83 db f8 a6 e5 d1 77 14 59 c7 d7 51 5c b9 0e 1a ed c2 d7 6b cf 9c f1 8a 64 d1 c9 73 30 9d 11 f7 b6 ff b3 99 b3 dc 34 00 16 5d 56 7d e6 80 6d d7 e6 aa 4c c2 2f b5 e7 97 16 21 9c 36 fa 98 3a d4 e4 e7 ce d7 b7 a9 b7 57 82 dc 4a 23 32 c8 b1 17 ac 0c 88 b2 c3 4d 52 52 e4 b1 25 6a 2d e9 a5 7d 19 32 c3 57 b9 59 35 c3 fa 85 01 52 62 61 7e 71 33 70 22 e1 e9 8b d9 73 77 8b 74 57 7a f6 a0 14 e8 2d 9b e2 26 ff 05 05 c0 fe 31 66 2e de ab ff 67 53 94 9e 33 23 8e d5 7e 99 7a f4 0a 26 58 56 50 19 91 88 6d 54 79 46 94 c0 ca 0b 19 b8 69 a2 d0 e5 dd 55 09 b9 5f c7 d8 20 fc 77 8e 69 21 93 85 2d 68 58 ff 04 0e c6 ce 2f d7 62 f1 08 48 c3 98 31 49 3d 2a 8e 0b 8a fb 3c e7 85 be de f9 dc 4e 01 cc ac af a3 87 a2 83 09 16 7b 7b 38 ba 7c 25 52 6b ad e0 10 f4 c9 de 19 d5 63 37 0c c7 64 56 3e f0 e2 39 74 e2 c1 0d e5 37 9c 18 a4 bb 72 d6 d3 7c 16 22 95 93 a8 ca 9c 61 ac 48 ad 0a 8b 26 ba 03 e8 2d 35 88 e4 95 fe c8 77 bf 59 65 d5 12 33 52 12 33 9e 69 ae 22 50 b9 39 ab 6f 00 27 ae 58 e7 ed d9 ac 9e 38 c9 ee bc a9 0d 4c 20 8f c1 ea 0d 21 97 12 10 3f bd 10 9a 9b b5 dc a3 83 9c d7 24 9e 3e 9b 52 6d 17 82 0e 32 8e 42 7c c5 ab 7b eb 4f 20 a3 03 a0 a2 33 d2 6e 68 24 a8 90 d8 ef ba b0 f6 82 0d 5f 14 81 de 1b c0 1f f4 9b 1b 7e 27 1d c6 05 cd 32 02 b7 09 4b 85 60 36 4c 63 60 1b 98 f8 8b 53 e5 78 60 bc d7 24 11 aa 0e f0 98 39 0a 57 ed 9d f4 b5 70 fe 88 20 f2 40 50 e7 9d 6f a0 a6 64 72 19 d5 ed 4c 35 0d 6b a6 74 a8 df b7 9c 01 56 0e ca 12 2e ca d0 12 7e 5d f6 2a 54 5e 0d 61 82 fe 99 8a 81 e3 56 a1 8f cf 4c d5 08 eb 50 d3 1a a4 de a3 fd 73 f8 9b ae 94 14 45 cd 0a 62 5c fb c3 86 7f 5d c8 95 42 7b a1 4b 19 59 71 1f 61 08 db 41 3a 71 ff 21 36 4c d4 4c 54 16 35 6d cd 92 15 14 3e 85 b9 02 69 d6 e5 ef 92 bb bb 98 23 d1 86 c6 10 13 b1 c4 82 3d 84 a7 9b 39 9a a7 51 b9 a1 39 56 e7 28 d6 a2 9e 00 2c cd a6 66 fa 5c bb 76 02 7c 5b f2 97 32 79 d4 fa 3b 82 ba 89 c6 9b b0 46 58 f6 a1 25 b2 d1 0a d6 84 c1 ab 01 00 a8 54 9d cb dc 80 f4 9d"
b = "01 9b 09 45 00 00 4a 4e d2 73 90 d1 ff 21 37 6e dc b5 c8 97 ea 27 df 8d 37 a2 ff e1 c0 fc 6b 2d 53 63 1c a7 73 06 34 ff 1b b5 23 36 98 1e ca 4e bf 13 67 b5 ea f0 57 7f 06 73 57 12 8d 9a e0 27 63 75 7a 5e 82 9c bf 3b fd d0 57 2d 6e 0b 15 85 de fd f6 ee e6 34 77 59 29 5e 1d fe ab 22 ed 32 ec c6 2c 90 3c 50 7f 38 4c 4b f9 07 e0 81 bd 9a e4 46 60 24 32 ff cd 7c 42 ee 94 98 c2 74 10 5d b7 39 a9 6f 83 6e 6b 94 71 a9 33 e7 58 0d d7 9f fc 1f 01 3c 92 aa 0b 96 7f 21 a4 26 1b b7 00 e2 ed 7d 63 1c 7a 7d 1b 5b 11 71 40 3e 38 d1 e0 16 74 a8 07 3b 0e 99 e5 03 79 a2 60 e3 52 1d c5 c2 45 cb a1 10 20 d5 64 e1 de 4b d2 2f 0d 5c a9 89 9a f0 26 41 ec 63 61 e8 89 fc b8 05 c4 3c 3a 11 bc 9d 14 22 9b 43 82 c3 d5 bf d0 44 aa 2f 0e f5 9b 4c ae 5a e6 c4 1a da cd e6 d1 fc 10 60 a6 22 6d 4c 4d dd 19 19 6d 72 91 41 64 6b a8 b1 16 ec 99 17 3a 66 f0 b7 21 ba 83 ae 0e 62 f3 04 38 a1 79 5b 89 14 a3 25 2e 02 33 fd b3 98 d7 d0 3e 20 dc aa 09 32 87 b8 77 e4 24 1c 1c b9 f2 7a 2b c6 ce ae 0a 50 03 30 92 96 62 82 a3 b4 1a 0a 46 5e 18 79 1b 1b be d8 23 e9 20 53 79 12 fa 6b db ab 75 f4 48 45 79 b5 fe 93 70 d1 c8 c4 40 3c 77 10 e6 5f 1b cc d7 69 29 22 f3 ea ba bc 9f f0 3f da 72 a5 86 ac 67 f1 4a f6 be 9b 40 ee d0 e1 07 93 14 09 38 16 48 0c 60 80 4a 60 94 b6 64 f7 9c f3 71 50 c7 b8 75 a2 67 67 34 f5 8c fa 56 0c cc 73 37 ed b5 c9 86 e4 86 56 68 4c a3 01 b8 67 4c 90 8f e8 b6 1b 35 e4 06 31 7d 26 c5 7d bf 51 ec fc ef 82 dd b7 2b f9 1b cf e5 ad 87 7a 56 c4 43 90 f3 c1 25 a8 a7 38 87 aa dc 2d 4a 58 bf da 06 9f 6c 15 6a 70 c6 18 ad 3c d8 b6 23 e5 54 35 fd 4b 90 a7 44 de 84 4e 15 75 3b 85 1e ae 20 c5 13 f7 a6 4c 63 67 56 f1 16 48 82 4c 0d 47 f1 78 ca 59 ca 67 ee 1d be cb b9 fc 59 53 9f f0 50 21 31 4b 23 d2 02 7c 4a 7d 76 a9 05 b3 b0 5a d3 d2 08 54 42 18 b3 65 83 c9 2e 74 7e bc 03 f1 c0 f1 95 7e 68 a9 7c fc 07 b7 ba ff 7d 60 bd 7d b3 6b 0d 7e 40 4b b1 16 83 cb cd 33 1e b7 94 d0 d7 a3 ab 5e 29 66 f6 a7 91 09 f3 f1 a5 c1 78 b7 4f af 2a 55 1d cb b5 70 b0 68 44 2a fa fb e9 ff 62 0d ac 66 c7 4f 81 b8 4b ee 0c df d7 8e e1 b2 42 35 8a db 6b 04 5d 0d da 06 b1 3f da 74 cc e0 ec ca a7 e2 23 3a 14 ad 39 a9 14 20 d3 04 55 d6 eb db 0d d2 18 f8 02 ae 8b 45 c5 ef 69 82 7c 8e f7 10 71 b7"

a = a.split(" ")
b = b.split(" ")
match = []

for x in range(len(a)):
  if a[x] == b[x]:
      match.append(a[x])

print(match)

如你所说,你只需要循环每一组并比较每个序列,你就会看到它们是否匹配。

答案 1 :(得分:0)

import itertools

def same_string(str1, str2):
   set1 = set(str1[begin:end] for (begin, end) in
              itertools.combinations(range(len(str1)+1), 2))
   set2 = set(str2[begin:end] for (begin, end) in
              itertools.combinations(range(len(str2)+1), 2))
   common = set1.intersection(set2)
   maximal = [com for com in common
              if sum((s.find(com) for s in common)) == -1 * (len(common)-1)]
   return [(s) for s in maximal]

same_string(string1,string2)

答案 2 :(得分:0)

Python标准库模块difflib有一个类SequenceMatcher,可用于提取公共子串。
该类的第一个参数是一个函数,它接受一个参数并返回布尔值。它用于忽略字符串中的字符。第二个参数是第一个字符串,第三个参数是第二个字符串,第四个参数是切换自动垃圾检测的标志。

如果切换字符串,输出可能会有所不同。

def common_substrings(is_junk=None, a='', b='', autojunk=True):
    matcher = SequenceMatcher(is_junk, a, b, autojunk)
    matches = matcher.get_matching_blocks()
    for match in matches:
        a_index, b_index, size = match
        if not size:
            break
        yield a[a_index:a_index+size]

print([' '.join(item) for item in common_substrings(None, hex1.split(), hex2.split(), False) if len(item) > 1])

输出;

['01 9b 09 45 00 00', '75 f4', '4c 63', 'b5 70']