在Python中模糊匹配大段文本中的字符串(网址)

4 投票
2 回答
1698 浏览
提问于 2025-04-16 18:17

我有一份公司名称的列表,还有一份提到这些公司名称的网址列表。

我的最终目标是查看这些网址,找出网址中有多少个公司的名字出现在我的列表里。

举个例子,这里有一个网址:http://www.dmx.com/about/our-clients

每个网址的结构都不一样,所以我没有好的办法用正则表达式去搜索,并为每个公司名称创建单独的字符串。

我想用一个循环来搜索列表中的每个公司名,看看它们是否出现在网址的全部内容中。但是我发现,Levenshtein算法更适合比较两个较小的字符串,而不是一个短字符串和一大段文本。

作为一个初学者,我应该往哪个方向去找解决方案呢?

2 个回答

3

我想补充一下senderle的回答,可能需要对你的名字进行一些规范化处理,比如去掉所有特殊字符,然后把这个处理应用到网页文本和你的字符串列表上。

def normalize_str(some_str):
    some_str = some_str.lower()
    for c in """-?'"/{}[]()&!,.`""":
        some_str = some_str.replace(c,"")
    return some_str

如果这样还不够好,你可以去看看difflib,然后做一些类似的操作:

for client in normalized_client_names:
    closest_client = difflib.get_closest_match(client_name, webpage_text,1,0.8)
    if len(closest_client) > 0:
         print client_name, "found as", closest_client[0]

我选择的这个任意的截止值(Ratcliff/Obershelp)比例是0.8,可能会太宽松或者太严格;你可以试着调整一下这个值。

5

听起来你并不需要什么“模糊”匹配。我猜你说的“url”是指“在这个地址上的网页”。你只需要用Python自带的子字符串搜索功能就可以了:

>>> import urllib2
>>> webpage = urllib2.urlopen('http://www.dmx.com/about/our-clients')
>>> webpage_text = webpage.read()
>>> webpage.close()
>>> for name in ['Caribou Coffee', 'Express', 'Sears']:
...     if name in webpage_text:
...         print name, "found!"
... 
Caribou Coffee found!
Express found!
>>> 

如果你担心字符串的大小写不一致,可以把它们都转换成大写。

>>> webpage_text = webpage_text.upper()
>>> for name in ['CARIBOU COFFEE', 'EXPRESS', 'SEARS']:
...     if name in webpage_text:
...         print name, 'found!'
... 
CARIBOU COFFEE found!
EXPRESS found!

撰写回答