在Python中模糊匹配大段文本中的字符串(网址)
我有一份公司名称的列表,还有一份提到这些公司名称的网址列表。
我的最终目标是查看这些网址,找出网址中有多少个公司的名字出现在我的列表里。
举个例子,这里有一个网址: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!