假设我们有一个关键词“智能音箱”,我们想通过这个关键词来查询它在 '智能音箱!#@@#我非常喜欢用智能音箱,#$#%智能音箱棒棒的,非常好用的,智能音箱真好玩#$%^^^智能音箱' 这样一段文字中相关联的文字,比如要截取出当前关键词出现的位置前后的五个字(去除标点符号),如果用python该如何实现呢?这里我们就会想到,需要用到哪些知识点:
1.字符串查找:
用法: str.find(str, beg=0, end=len(string))
参数:
str -- 指定检索的字符串,当只传入此参数时,默认查找在字符串里第一个出现的子串
beg -- 开始索引,默认为0。
end -- 结束索引,默认为字符串的长度。
返回值:
如果包含子字符串返回开始的索引值,否则返回-1。
2.字符串检索并替换 re.sub
用法:re.sub(pattern, repl, string, count=0, flags=0)
参数:
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
flags : 编译时用的匹配模式,数字形式
前三个为必选参数,后两个为可选参数。
3.移除字符串头尾指定的字符(默认为空格)或字符序列
用法:str.strip([chars])
参数:chars -- 移除字符串头尾指定的字符序列。
返回值:
返回移除字符串头尾指定的字符序列生成的新字符串。
下面直接上代码:
import re
def test(keyWord,s,subStrLen):
# 定义正则表达去除字符串里所有标点符号
r = '[’!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~\n。!,]+'
s = re.sub(r, '', s).strip() # 同时去除字符串前后的空格
# 当find中没有第二个参数起步下标时,默认计算第一个要查找的字符的下标
n = s.find(keyWord)
arr = [] # 将截取出的字符串保存在此数组中
# 当find查找到要统计下标的字符时,返回字符所在下标,直到统计没有这个字符时,返回的下标为-1。
while n != -1:
# 如果查找到的下标小于需要截取的字符长度,则截取的首index取0
if n < subStrLen:
startStr = s[0: n] # 截取出关键字前面的5个字符
else:
startStr = s[n-subStrLen: n]
# 如果截取出的s不含有keyWord关键字,再统计(功能要求:不统计关键字带关键字本身的字符串)
if len(startStr) > 0 and keyWord not in startStr:
arr.append(startStr)
# 截取出关键字后的5个字符
endStr = s[n+len(keyWord): n+len(keyWord)+subStrLen]
# 如果截取出的s不含有keyWord关键字,再统计
if len(endStr) and keyWord not in endStr:
arr.append(endStr)
# 方案一:从当前统计到的下标 + subStrLen(即5)-1的位置开始,继续统计下标(不用考虑相邻关键字)
n = s.find(keyWord, n + subStrLen - 1)
# 方案二: 每次取完数据,则截取掉,防止相邻关键字之间的字符重复截取(根据自己需要,自行调整)
# s = s[n+len(keyWord)+subStrLen:]
# n = s.find(keyWord)
print(arr)
if __name__ == '__main__':
keyWord = '智能音箱'
s = '智能音箱!#@@#我非常喜欢用智能音箱,#$#%智能音箱棒棒的,非常好用的,智能音箱真好玩#$%^^^智能音箱'
subStrLen = 5 # 字符串截取长度
test(keyWord, s, subStrLen)
随便写的一个小demo,如果以上对你有帮助,记得点赞哦~