📜  python中的模糊查找(1)

📅  最后修改于: 2023-12-03 15:04:36.799000             🧑  作者: Mango

Python中的模糊查找

在开发中,有时候需求并不是必须要精确匹配,需要通过一些模糊的方式来查找匹配的结果。Python中有许多工具和库可以帮忙实现这样的需求。

字符串模糊匹配

最常见的模糊匹配应该就是字符串模糊匹配了。Python中有几种方式可以实现字符串模糊匹配,下面分别介绍一下。

1. in关键字

Python中通过in关键字可以判断一个字符串是否包含另一个字符串。这种方式并不是特别精确,但是使用起来非常方便。

if 'hello' in 'hello world':
    print('match')

此时,输出的结果是match。

2. re模块

Python中自带了re模块,可以用来进行正则匹配。正则表达式可以描述字符串的规则,通过Pattern对象可以快速匹配符合规则的字符串。

下面是一个使用re的例子,匹配所有以'a'开头,以'at'结尾,中间任意字符的字符串。

import re

match = re.search('a.*?at', 'The cat in the hat')
if match:
    print(match.group())
3. difflib模块

difflib模块可以用来进行模糊匹配和相似度计算。可以用函数get_close_matches来查找最接近的匹配。它有三个参数:一个查询词、候选词的列表,以及匹配的数量。这个函数会返回一个与查询词最接近的词的列表。

import difflib

fruits = ['apple', 'banana', 'cherry', 'fig', 'kiwi']
matches = difflib.get_close_matches('fi', fruits, n=3, cutoff=0.6)
print(matches)
4. fuzzywuzzy库

fuzzywuzzy库是一个用于字符串匹配的Python库,通过计算字符串之间的距离来进行模糊匹配。可以用它的函数process来查找最接近的匹配。它有三个参数:查询词、候选词的列表,以及匹配的数量。这个函数会返回一个基于Levenshtein距离的排好序的匹配的列表。

from fuzzywuzzy import process

fruits = ['apple', 'banana', 'cherry', 'fig', 'kiwi']
matches = process.extract('fi', fruits, limit=3)
print(matches)
图像模糊匹配

除了字符串模糊匹配,还有图像模糊匹配。Python中也有一些库可以用来实现这个功能。

1. opencv-python库

opencv-python库是一个计算机视觉库,可以用来处理图像和视频。它也可以用来进行图像模糊匹配。

下面是一个例子,比较两个图片的相似度,返回相似度分数。

import cv2

img1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)
sift = cv2.xfeatures2d.SIFT_create()

kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)

bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

good = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good.append([m])

print(len(good) / len(matches) * 100)
2. scikit-image库

scikit-image库是一个用Python编写的图像处理库,可以用来处理数字图像。它也提供了一些函数来进行图像模糊匹配。

下面是一个例子,比较两个图片的相似度,返回相似度分数。

from skimage import io, color, feature

img1 = color.rgb2gray(io.imread('image1.jpg'))
img2 = color.rgb2gray(io.imread('image2.jpg'))

keypoints1, descriptors1 = feature.ORB().detect_and_extract(img1)
keypoints2, descriptors2 = feature.ORB().detect_and_extract(img2)

matches12 = feature.match_descriptors(descriptors1, descriptors2, cross_check=True)

print(len(matches12) / len(keypoints1) * 100)
总结

以上介绍了Python中几种常见的模糊匹配方法,从字符串匹配到图像匹配都有涉及。在实际开发中,了解这些方法可以帮助我们更快地解决问题。