原文链接:http://www.juzicode.com/python-module-flashtext
今天给大家介绍一款比正则表达式更高效的文本查找、替换工具:flashtext。
安装和导入
安装仍然是老规矩,pip安装:
pip install flashtext
安装后可以通过pip list查看版本,桔子菌当前安装的是2.7版本:
pip list
......
flashtext 2.7
......
用法入门
1、查找关键词
首先导入KeywordProcessor类并初始化,然后使用add_keyword()方法添加关键词,最后用extract_keywords()方法搜索关键词,如果找到关键词则会在返回的列表中给出:
#juzicode.com/VX公众号:juzicode
# 导入
from flashtext import KeywordProcessor
# 初始化实例:KeywordProcessor
key_proc = KeywordProcessor()
# 在生成的实例中添加关键词
key_proc.add_keyword('python')
key_proc.add_keyword('编程')
key_proc.add_keyword('C++')
# extract_keywords()方法搜索关键词,如果找到关键词则会在返回的列表中给出
text = "在juzicode.com可以找到很多有关Python的编程信息."
found = key_proc.extract_keywords(text)
print('text:', text)
print('found:', found)
运行结果:
text: 在juzicode.com可以找到很多有关Python的编程信息.
found: ['python', '编程']
从这个例子可看出,text字符串中存在的’Python’和’编程’ 等关键词在返回结果中,不存在的’C++’没有在返回结果中。
2、对关键词进行替换
如果要查找出关键词并进行替换,则在用add_keyword()方法添加关键词的时候,第2个参数传入替换后的字符串,再使用replace_keywords()方法替换。
#juzicode.com/VX公众号:juzicode
from flashtext import KeywordProcessor
key_proc = KeywordProcessor()
# 添加关键词和替换词
key_proc.add_keyword('Python', 'C++')
key_proc.add_keyword('VX:桔子code', 'VX:juzicode')
# 替换关键词
text = "在juzicode.com可以找到很多有关Python的编程信息."
new_text = key_proc.replace_keywords(text)
print('text:', text)
print('new_text:', new_text)
运行结果:
text: 在juzicode.com可以找到很多有关Python的编程信息.
new_text: 在juzicode.com可以找到很多有关C++的编程信息.
进阶用法
1、使用列表方式添加关键词
add_keyword()方法每次只能添加一个关键词,如果将关键词组成一个list,再用add_keywords_from_list()方法就可以一次添加多个关键词。
#juzicode.com/VX公众号:juzicode
from flashtext import KeywordProcessor
key_proc = KeywordProcessor()
# 添加关键词
keywords = ['python', '编程', 'VX:桔子code']
key_proc.add_keywords_from_list(keywords)
# 搜索关键词
text = "在juzicode.com可以找到很多有关Python的编程信息."
found = key_proc.extract_keywords(text)
print('text:', text)
print('found:', found)
运行结果:
text: 在juzicode.com可以找到很多有关Python的编程信息.
found: ['python', '编程']
2、使用字典方式添加关键词
查找关键词可以用列表的方式一次性添加,如果要替换关键词我们可以使用字典方式一次性构建关键词。
不过这里有个不太符合习惯的地方, 在字典中的key-value组合,其中value是替换前的对象,必须是list类型,既然作为list就可以实现多种字符串替换成一种目标字符串;key则作为替代后的字符串。比如下面的例子中’Python3’和’Python2’是要查找的对象,‘py’则是替代后的对象。这时使用add_keywords_from_dict()方法添加关键词。
#juzicode.com/VX公众号:juzicode
from flashtext import KeywordProcessor
key_proc = KeywordProcessor()
# 批量添加关键词
keywords = {'py': ['Python3','Python2'], '用户友好': ['强大',], 'cpp': ['C++',]}
key_proc.add_keywords_from_dict(keywords)
# 替换关键词
text = "Python3和Python2是一种强大的编程语言."
new_text = key_proc.replace_keywords(text)
print('text:', text)
print('new_text:', new_text)
# 获取所有关键词
print(key_proc.get_all_keywords())
运行结果:
text: Python3和Python2是一种强大的编程语言.
new_text: py和py是一种用户友好的编程语言.
{'python3': 'py', 'python2': 'py', '强大': '用户友好', 'c++': 'cpp'}
3、从文件中添加关键词
使用add_keyword_from_file()方法可以从文件加载关键词列表或者字典,调用该方法时传入保存了关键词的文件路径,默认使用utf8编码读出文件。使用替换方式的文件格式如下,用 => 指明替代关系(如果只是查找关键词则不需要使用=>映射替代关系):
Python3=>py
Python2=>py
强大=>用户友好
C++=>cpp
从文件读出关键词并替换的例子:
#juzicode.com/VX公众号:juzicode
from flashtext import KeywordProcessor
key_proc = KeywordProcessor()
# 文件方式添加关键词
key_proc.add_keyword_from_file('keywords.txt')
# 替换关键词
text = "Python3和Python2是一种强大的编程语言."
new_text = key_proc.replace_keywords(text)
print('text:', text)
print('new_text:', new_text)
# 获取所有关键词
print(key_proc.get_all_keywords())
运行结果:
text: Python3和Python2是一种强大的编程语言.
new_text: py和py是一种用户友好的编程语言.
{'python3': 'py', 'python2': 'py', '强大': '用户友好', 'c++': 'cpp'}
4、大小写敏感查找
在初始化KeywordProcessor()实例时,传入case_sensitive=True可以实现大小写敏感方式查找关键词。下面的例子中构建了key_proc和key_proc2的2个实例,分别对应了不区分和区分大小写的2种情况。
#juzicode.com/VX公众号:juzicode
from flashtext import KeywordProcessor
# 初始化,不区分大小写
key_proc = KeywordProcessor(case_sensitive=False)
key_proc.add_keyword('python')
key_proc.add_keyword('编程')
key_proc.add_keyword('VX:桔子code')
# 初始化,区分大小写
key_proc2 = KeywordProcessor(case_sensitive=True)
key_proc2.add_keyword('python')
key_proc2.add_keyword('编程')
key_proc2.add_keyword('VX:桔子CODE')
# extract_keywords()方法搜索关键词
text = "Python是一种强大的编程语言."
found = key_proc.extract_keywords(text)
found2 = key_proc2.extract_keywords(text)
print('text :', text)
print('found :', found)
print('found2:', found2)
print('key_proc关键词 :',key_proc.get_all_keywords())
print('key_proc2关键词 :',key_proc2.get_all_keywords())
运行结果:
text : Python是一种强大的编程语言.
found : ['python', '编程']
found2: ['编程']
key_proc关键词 : {'python': 'python', '编程': '编程', 'vx:桔子code': 'VX:桔子code'}
key_proc2关键词 : {'python': 'python', '编程': '编程', 'VX:桔子CODE': 'VX:桔子CODE'}
从这个例子可以看出,在初始化KeywordProcessor()实例时如果设置case_sensitive=True,将会按照大小写敏感的方式查找关键词。上例中的key_proc2设置了大小写敏感,所以结果中没有找到全小写的’python’的关键词。
从get_all_keywords()方法返回的关键词字典也可以看到,如果不区分大小写,关键词字典的key值经过了lower()处理。
5、返回关键词的位置
#juzicode.com/VX公众号:juzicode
from flashtext import KeywordProcessor
# 初始化实例:KeywordProcessor
key_proc = KeywordProcessor()
# 在生成的实例中添加关键词
key_proc.add_keyword('python')
key_proc.add_keyword('编程')
key_proc.add_keyword('C++')
# extract_keywords()方法搜索关键词
text = "在juzicode.com可以找到很多有关Python的编程信息."
found = key_proc.extract_keywords(text, span_info=True)
print('text:', text)
print('found:', found)
#通过返回字符串位置
for f in found:
print(f)
print(text[f[1]:f[2]]) # 第1和第2个元素为返回字符串的起始、结束位置
运行结果:
text: 在juzicode.com可以找到很多有关Python的编程信息.
found: [('python', 21, 27), ('编程', 28, 30)]
('python', 21, 27)
Python
('编程', 28, 30)
编程