Python中的字符串查找操作方法总结


Posted in Python onJune 27, 2016

基本的字符串位置查找方法
Python 查找字符串使用 变量.find("要查找的内容"[,开始位置,结束位置]),开始位置和结束位置,表示要查找的范围,为空则表示查找所有。查找到后会返回位置,位置从0开始算,如果每找到则返回-1。

str = 'a,hello' 
print str.find('hello') # 在字符串str里查找字符串hello 
>> 2     # 输出结果

朴素匹配算法

朴素匹配算法是对目标字符串和模板字符串的一一匹配。如果匹配得上,下标向右移一位, 否则清空并重新开始匹配。

target = 'abb aba'
pattern = 'aba'

def match(target, pattern):
  i = j = 0
  n, m = len(target), len(pattern)
  while i < n and j < m:
    # 如果字符相等则目标和模板的下标都向右移
    if target[i] == pattern[j]:
      i, j = i+1, j+1
    else:
      # 如果字符不相等则目标下标切换到不相等的下标
      # 模板下标移动到初始下标
      i = i - j + 1
      j = 0
  if j == m:
    return i - j
  return -1

把上面的加上print后打印一遍

#修改的地方
else:
  i = i -j + 1
  j = 0
  print(target[i], pattern[j], i, j)

# 打印结果
b a 1 0
b a 2 0
 a 3 0
a a 4 0

循环会一直到相等的匹配值, 这个方法效率低下,主要是在不匹配时会重新把模板字符循环一次。最多可能会出现 m * (n-m +1)次。m是模板字符的长度,n-m + 1是排除不等字符的次数。

KMP 算法

kmp是通过已知匹配的字符进行移位的算法,比如上面的abb 中跟abc比较的话 ab是已知的。

def match(target, pattern):
  i = j = 0
  n, m = len(target), len(pattern)
  while i < n and j < m:
    # 如果字符相等则目标和模板的下标都向右移
    if if j == -1 and target[i] == pattern[j]:
      i, j = i+1, j+1
    else:
      # 这里通过next 函数来判断位移个数
      i = i - j + pattern_next(pattern[:j])
      j = 0
  if j == m:
    return i - j
  return -1


def pattern_next(s):  
  prefix = [s[:i+1] for i in range(len(s)-1)]
  suffix = [s[i+1:] for i in range(len(s)-1)]
  l = list(set(prefix) & set(suffix))
  return len(l)
Python 相关文章推荐
python生成器generator用法实例分析
Jun 04 Python
Python 两个列表的差集、并集和交集实现代码
Sep 21 Python
Python 常用的安装Module方式汇总
May 06 Python
[原创]使用豆瓣提供的国内pypi源
Jul 02 Python
人工智能最火编程语言 Python大战Java!
Nov 13 Python
python实现播放音频和录音功能示例代码
Dec 30 Python
python实发邮件实例详解
Nov 11 Python
Python进程池Pool应用实例分析
Nov 27 Python
pytorch之ImageFolder使用详解
Jan 06 Python
如何在Django中使用聚合的实现示例
Mar 23 Python
python 实现图片裁剪小工具
Feb 02 Python
Python Selenium异常处理的实例分析
Feb 28 Python
解析Python中的__getitem__专有方法
Jun 27 #Python
详解Python中的__getitem__方法与slice对象的切片操作
Jun 27 #Python
Python使用smtplib模块发送电子邮件的流程详解
Jun 27 #Python
Python教程之全局变量用法
Jun 27 #Python
python设计模式大全
Jun 27 #Python
Python处理JSON时的值报错及编码报错的两则解决实录
Jun 26 #Python
Python使用自带的ConfigParser模块读写ini配置文件
Jun 26 #Python
You might like
使用数据库保存session的方法
2006/10/09 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
可以支持多中格式的JS键盘
2007/05/02 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
20个最新的jQuery插件
2012/01/13 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
html5+javascript制作简易画板附图
2014/04/25 Javascript
JavaScript用Number方法实现string转int
2014/05/13 Javascript
用js判断是否为360浏览器的实现代码
2015/01/15 Javascript
nodejs中实现阻塞实例
2015/03/24 NodeJs
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
基于vue的换肤功能的示例代码
2017/10/10 Javascript
Angular中支持SCSS的方法
2017/11/18 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
[37:47]IG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python为tornado添加recaptcha验证码功能
2014/02/26 Python
Python中文竖排显示的方法
2015/07/28 Python
简单了解Python中的几种函数
2017/11/03 Python
python实现log日志的示例代码
2018/04/28 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
Pytorch之保存读取模型实例
2019/12/30 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
python中的 zip函数详解及用法举例
2020/02/16 Python
Python之字典添加元素的几种方法
2020/09/30 Python
公司市场专员岗位职责
2014/06/29 职场文书
区域经理岗位职责
2015/02/02 职场文书
发言稿之优秀教师篇
2019/09/26 职场文书
纯CSS实现一个简单步骤条的示例代码
2022/07/15 HTML / CSS