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 相关文章推荐
pycharm 使用心得(九)解决No Python interpreter selected的问题
Jun 06 Python
基于Python的文件类型和字符串详解
Dec 21 Python
Python深度优先算法生成迷宫
Jan 22 Python
Python request设置HTTPS代理代码解析
Feb 12 Python
Python中单例模式总结
Feb 20 Python
对tf.reduce_sum tensorflow维度上的操作详解
Jul 26 Python
Python 实现数据结构-循环队列的操作方法
Jul 17 Python
在python中用url_for构造URL的方法
Jul 25 Python
Python中BeautifuSoup库的用法使用详解
Nov 15 Python
Python处理mysql特殊字符的问题
Mar 02 Python
Python爬虫中Selenium实现文件上传
Dec 04 Python
python 用递归实现通用爬虫解析器
Apr 16 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和ACCESS写聊天室(四)
2006/10/09 PHP
php echo 输出字符串函数详解
2010/05/13 PHP
PHP字符串处理的10个简单方法
2010/06/30 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
javascript cookies 设置、读取、删除实例代码
2010/04/12 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
JavaScript中逗号运算符介绍及使用示例
2015/03/13 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
Vue入门之数据绑定(小结)
2018/01/08 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
vue配置文件实现代理v2版本的方法
2019/06/21 Javascript
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
Python3字符串encode与decode的讲解
2019/04/02 Python
python django 原生sql 获取数据的例子
2019/08/14 Python
线程安全及Python中的GIL原理分析
2019/10/29 Python
Numpy中对向量、矩阵的使用详解
2019/10/29 Python
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
新奇的小玩意:IWOOT
2016/07/21 全球购物
HMV日本官网:全球知名的音乐、DVD和电脑游戏零售巨头
2016/08/13 全球购物
应届生自我鉴定
2013/12/11 职场文书
财务会计专业求职信范文
2013/12/31 职场文书
证婚人搞笑证婚词
2014/01/10 职场文书
起诉离婚协议书样本
2014/11/25 职场文书
建房合同协议书
2016/03/21 职场文书
php TP5框架生成二维码链接
2021/04/01 PHP
Java界面编程实现界面跳转
2022/06/16 Java/Android