class StrPlaces:
"""用户需求在原文档中,查找相关字符并给出相关信息,并可实现替换操作,
用字符串切片功能实现str.replace功能"""
def __init__(self, str, rex ,repl):
self.str = str # 原文档
self.rex = rex # 被替换词
self.repl = repl # 替换词
def _rex_pnext_(self):
"""构造被替换词的pnext表,方便进行匹配"""
rex = self.rex
i, k, m = 0, -1, len(rex)
pnext = [-1] * m
while i < m - 1: # 生成下一个pnext元素
if k == -1 or rex[i] == rex[k]:
i, k = i + 1, k + 1
if rex[i] == rex[k]:
pnext[i] = pnext[k]
else:
pnext[i] = k
else:
k = pnext[k]
return pnext
def _matching_KMP_(self):
"""KMP匹配程序"""
t = self.str # 主串
r = self.rex # 模式串
j, i = 0, 0
n, m = len(t), len(r)
replace_list = []
while j < n:
j = self._match_(replace_list, j) + m
if j >= n:
return replace_list
return -1
def replace(self):
"""通过字符串切片形式实现str.replace功能"""
replace_list = self._matching_KMP_()
if replace_list != -1:
for replace_start in replace_list:
replace_end = replace_start + len(self.rex)
self.str = self.str[0:replace_start] + self.repl + self.str[replace_end:]
return self.str
def _match_(self, relaced_list, j=0):
"""KMP匹配实现程序"""
t = self.str
r = self.rex
i = 0
pnext = self._rex_pnext_()
n, m = len(t), len(r)
while j < n and i < m:
if i == -1 or t[j] == r[i]:
j, i = j + 1, i + 1
else:
i = pnext[i]
if i == m or j >= n: # 此处必须加上j>=n否则报错
relaced_list.append(j - i)
return j - i
Python是一个高度集成化的语言,实际上以上代码只需要简简单单使用str.replace()即可实现,但是还是想用较基础的功能实现替换,以上做参考,初学者,希望有前辈大哥大姐有没有关于代码习惯方面或者代码有误可以优化方面给点指导,十分感谢,祝你们过年好。