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备份文件以及mysql数据库的脚本代码
Jun 10 Python
python多线程编程中的join函数使用心得
Sep 02 Python
Python实现查找系统盘中需要找的字符
Jul 14 Python
Python 绘图和可视化详细介绍
Feb 11 Python
Python生成随机数组的方法小结
Apr 15 Python
Python中input与raw_input 之间的比较
Aug 20 Python
Python2与python3中 for 循环语句基础与实例分析
Nov 20 Python
python用列表生成式写嵌套循环的方法
Nov 08 Python
扩展Django admin的list_filter()可使用范围方法
Aug 21 Python
python pyinstaller打包exe报错的解决方法
Nov 02 Python
python如何实现单链表的反转
Feb 10 Python
Python 高级库15 个让新手爱不释手(推荐)
May 15 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
PHP经典的给图片加水印程序
2006/12/06 PHP
用php或asp创建网页桌面快捷方式的代码
2010/03/23 PHP
php数据类型判断函数有哪些
2013/09/23 PHP
php利用cookie实现自动登录的方法
2014/12/10 PHP
PHP通过加锁实现并发情况下抢码功能
2016/08/10 PHP
Js 获取Gridview选中行的内容操作步骤
2013/02/05 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
js实现进度条的方法
2015/02/13 Javascript
聊一聊Vue.js过渡效果
2016/09/07 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
基于JavaScript中标识符的命名规则介绍
2018/01/06 Javascript
Vue组件通信的四种方式汇总
2018/02/08 Javascript
Vue.directive使用注意(小结)
2018/08/31 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
Python中处理unchecked未捕获异常实例
2015/01/17 Python
python超简单解决约瑟夫环问题
2015/05/12 Python
Python中的rjust()方法使用详解
2015/05/19 Python
python轻松查到删除自己的微信好友
2016/01/10 Python
深入理解python try异常处理机制
2016/06/01 Python
Python3.x对JSON的一些操作示例
2017/09/01 Python
pycharm: 恢复(reset) 误删文件的方法
2018/10/22 Python
Tensorflow 实现释放内存
2020/02/03 Python
Python中itertools的用法详解
2020/02/07 Python
python 实现单例模式的5种方法
2020/09/23 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
日本最大的购物网站乐天市场国际版:Rakuten Global Market(支持中文)
2020/02/03 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
美国家居装饰店:Z Gallerie
2020/12/28 全球购物
努力学习保证书
2015/02/26 职场文书
初中班主任工作总结2015
2015/05/13 职场文书
2015年秋季学校开学标语
2015/07/16 职场文书
Golang 遍历二叉树
2022/04/19 Golang