Python库自动检测未知的相似字符串

Python库自动检测未知的相似字符串,python,Python,我有一个非常大的文件,有数百万条指向windows系统上各种可执行文件的路径。下面是一个简单的例子: C:\windows\ccmcache\1d\Deploy-Application.exe C:\WINDOWS\ccmcache\7\Deploy-Application.exe C:\windows\ccmcache\2o\Deploy-Application.exe C:\WINDOWS\ccmcache\6\Deploy-Application.exe C:\WINDOWS\ccmca

我有一个非常大的文件,有数百万条指向windows系统上各种可执行文件的路径。下面是一个简单的例子:

  • C:\windows\ccmcache\1d\Deploy-Application.exe
  • C:\WINDOWS\ccmcache\7\Deploy-Application.exe
  • C:\windows\ccmcache\2o\Deploy-Application.exe
  • C:\WINDOWS\ccmcache\6\Deploy-Application.exe
  • C:\WINDOWS\ccmcache\15\Deploy-Application.exe
  • C:\WINDOWS\ccmcache\m\Deploy-Application.exe
  • C:\WINDOWS\ccmcache\1g\Deploy-Application.exe
  • C:\windows\ccmcache\2r\Deploy-Application.exe
  • C:\windows\ccmcache\1l\Deploy-Application.exe
  • C:\windows\ccmcache\2s\Deploy-Application.exe

  • C:\Users\user2345235\temp\test\1\Another1-Application.exe
  • C:\Users\user1324asdf\temp\other-applicationon.exe
  • C:\Users\user23452---5\temp\lili\other-Application.exe
  • C:\Users\user23hkjhf_5\temp\An0ther-Application.exe
作为一个人,我可以识别出这些字符串是相似的,并且可以很容易地将它们与代码中的某些正则表达式进行匹配。然而,我的问题是首先要找到这些模式,因为这些模式太多了,我完全不知道,并且经常变化

我的目标是编写一个python脚本,以一定程度的确定性找到这些类似的字符串,并为我对它们进行分组


我应该研究哪些方法、库、关键字等来解决此问题?

一种可能的方法是通过计算字符串之间的距离来解决此问题。为此,您可以使用lib

希望这有帮助

编辑:

更熟悉该主题的两个起点:

试试,一个软字符串匹配器。如果您保持字符串的原样或先将其小写,则会产生不同:

从fuzzyfuzzy导入fuzz
进口itertools
行=[
'C:\windows\ccmcache\1d\Deploy Application.exe',
'C:\WINDOWS\ccmcache\m\Deploy Application.exe',
“user5323\A-different-Application.bat”,
]
对于itertools.组合(行,r=2)中的行1和行2:
案例匹配=模糊比率(第1行,第2行)
不区分大小写匹配=fuzz.ratio(line1.lower(),line2.lower())
打印(第1行[:10],“…”,第1行[:-10])
打印(第2行[:10],“…”,第2行[:-10])
打印(大小写匹配,不区分大小写匹配)
打印()

一种相当直接和简单的方法是简单地检查一对字符串的“差异有多大”。像这样:

import difflib
from collections import defaultdict


grouping_requirement = 0.75 # (0;1), the closer to 1, the stronger the equality needs to be to be grouped

s = r'''C:\windows\ccmcache\1d\Deploy-Application.exe
C:\WINDOWS\ccmcache\7\Deploy-Application.exe
C:\windows\ccmcache\2o\Deploy-Application.exe
C:\WINDOWS\ccmcache\6\Deploy-Application.exe
C:\WINDOWS\ccmcache\15\Deploy-Application.exe
C:\WINDOWS\ccmcache\m\Deploy-Application.exe
C:\WINDOWS\ccmcache\1g\Deploy-Application.exe
C:\windows\ccmcache\2r\Deploy-Application.exe
C:\windows\ccmcache\1l\Deploy-Application.exe
C:\windows\ccmcache\2s\Deploy-Application.exe
C:\Users\user23452345\temp\test\1\Another1-Application.exe
C:\Users\user1324asdf\temp\Another-Applicatiooon.exe
C:\Users\user23452---5\temp\lili\Another-Application.exe
C:\Users\user23hkjhf_5\temp\An0ther-Application.exe'''

groups = defaultdict(list)


def match_ratio(s1,s2):
    return difflib.SequenceMatcher(None,s1,s2).ratio()


for line in set(s.splitlines()):
    for group in groups:
        if match_ratio(group, line) > grouping_requirement:
            groups[group].append(line)
            break
    else:
        groups[line].append(line)

for group in groups.values():
    print(', '.join(group))
    print()
这个小应用程序的输出是:

C:\WINDOWS\ccmcache\1g\Deploy-Application.exe, C:\WINDOWS\ccmcache\m\Deploy-Application.exe, C:\windows\ccmcache\1l\Deploy-Application.exe, C:\WINDOWS\ccmcache\15\Deploy-Application.exe, C:\WINDOWS\ccmcache\7\Deploy-Application.exe, C:\WINDOWS\ccmcache\6\Deploy-Application.exe, C:\windows\ccmcache\2s\Deploy-Application.exe, C:\windows\ccmcache\1d\Deploy-Application.exe, C:\windows\ccmcache\2o\Deploy-Application.exe, C:\windows\ccmcache\2r\Deploy-Application.exe

C:\Users\user23452345\temp\test\1\Another1-Application.exe, C:\Users\user23hkjhf_5\temp\An0ther-Application.exe, C:\Users\user1324asdf\temp\Another-Applicatiooon.exe, C:\Users\user23452---5\temp\lili\Another-Application.exe

正如您在代码段顶部看到的,您看到有一个常量,
grouping\u requirement
,我任意将其设置为0.75。如果将该值减小到接近
0.0
,将有更多的路径被分组在一起,如果将该值增大到接近1.0,将有更少的路径被分组。祝你好运

最后一个“\”之后的每件事都重要吗?因为如果只是这样,你可以把最后一个“\”之后的所有东西都拿出来比较,忽略前面的路径。第二部分是一个问题,我认为对于这样的事情,神经网络将是一个有趣的解决方案。或者你检查在最后一个“\”之后的最后一部分有多少相似的字母,如果大于75%或者类似的话。字谜让事情变得困难,虽然是的。它应该计入相似性。不重要的是驾驶证,我会调查的!它们可以都是小写,这不应该是个问题
C:\WINDOWS\ccmcache\1g\Deploy-Application.exe, C:\WINDOWS\ccmcache\m\Deploy-Application.exe, C:\windows\ccmcache\1l\Deploy-Application.exe, C:\WINDOWS\ccmcache\15\Deploy-Application.exe, C:\WINDOWS\ccmcache\7\Deploy-Application.exe, C:\WINDOWS\ccmcache\6\Deploy-Application.exe, C:\windows\ccmcache\2s\Deploy-Application.exe, C:\windows\ccmcache\1d\Deploy-Application.exe, C:\windows\ccmcache\2o\Deploy-Application.exe, C:\windows\ccmcache\2r\Deploy-Application.exe

C:\Users\user23452345\temp\test\1\Another1-Application.exe, C:\Users\user23hkjhf_5\temp\An0ther-Application.exe, C:\Users\user1324asdf\temp\Another-Applicatiooon.exe, C:\Users\user23452---5\temp\lili\Another-Application.exe