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的Twisted框架编写非阻塞程序的代码示例
May 25 Python
详解Python中 __get__和__getattr__和__getattribute__的区别
Jun 16 Python
python使用pymysql实现操作mysql
Sep 13 Python
Python实现简单的多任务mysql转xml的方法
Feb 08 Python
Python字符串拼接的几种方法整理
Aug 02 Python
Numpy掩码式数组详解
Apr 17 Python
我们为什么要减少Python中循环的使用
Jul 10 Python
Python基于DB-API操作MySQL数据库过程解析
Apr 23 Python
PyInstaller的安装和使用的详细步骤
Jun 02 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
Dec 07 Python
Python趣味挑战之实现简易版音乐播放器
May 28 Python
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
May 31 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
德劲1102收音机的打理维修案例
2021/03/02 无线电
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
php连接oracle数据库及查询数据的方法
2014/12/29 PHP
php使用curl伪造浏览器访问操作示例
2019/09/30 PHP
javascript 拖放效果实现代码
2010/01/22 Javascript
jQuery与ExtJS之选择实例分析
2010/08/19 Javascript
基于jQuery的360图片展示实现代码
2012/06/14 Javascript
JS实现的用来对比两个用指定分隔符分割的字符串是否相同
2014/09/19 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
2015/03/05 Javascript
javascript相关事件的几个概念
2015/05/21 Javascript
原生JS实现美图瀑布流布局赏析
2015/09/07 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
IE和Firefox之间在JavaScript语法上的差异
2016/04/22 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
详解Node.js项目APM监控之New Relic
2017/05/12 Javascript
jQuery Masonry瀑布流布局神器使用详解
2017/05/25 jQuery
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
Python 的 Socket 编程
2015/03/24 Python
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
python pip源配置,pip配置文件存放位置的方法
2019/07/12 Python
使用Python实现分别输出每个数组
2019/12/06 Python
python3 requests库实现多图片爬取教程
2019/12/18 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
2020/05/25 Python
浅谈HTML5 FileReader分布读取文件以及其方法简介
2017/11/09 HTML / CSS
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
struct和class的区别
2015/11/20 面试题
中国文明网签名寄语
2014/01/18 职场文书
质量安全标语
2014/06/07 职场文书
安装工程师岗位职责
2015/02/13 职场文书
农村老人去世追悼词
2015/06/23 职场文书