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计算字符宽度的方法
Jun 14 Python
利用python求相邻数的方法示例
Aug 18 Python
Python 和 JS 有哪些相同之处
Nov 23 Python
用Python徒手撸一个股票回测框架搭建【推荐】
Aug 05 Python
Python对列表的操作知识点详解
Aug 20 Python
基于Python中的yield表达式介绍
Nov 19 Python
基于python判断目录或者文件代码实例
Nov 29 Python
pytorch-神经网络拟合曲线实例
Jan 15 Python
详解Python中namedtuple的使用
Apr 27 Python
浅析Python打包时包含静态文件处理方法
Jan 15 Python
python实现求纯色彩图像的边框
Apr 08 Python
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
May 24 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开发中四种查询返回结果分析
2011/01/02 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
这些年、我收集的JQuery代码小结
2012/08/01 Javascript
jQuery中 prop() attr()使用详解
2015/05/19 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
2017/10/12 Javascript
解决vue 按钮多次点击重复提交数据问题
2018/05/10 Javascript
jQuery中元素选择器(element)简单用法示例
2018/05/14 jQuery
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
vue项目中在外部js文件中直接调用vue实例的方法比如说this
2019/04/28 Javascript
Javascript数组方法reduce的妙用之处分享
2019/06/10 Javascript
JavaScript面试中常考的字符串操作方法大全(包含ES6)
2020/05/10 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
[02:23]2018DOTA2亚洲邀请赛趣味视频——反应测试
2018/04/04 DOTA
Django Admin实现上传图片校验功能
2016/03/06 Python
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
Python包资源下载路径报404解决方案
2020/11/05 Python
金融专业个人求职信
2013/09/22 职场文书
怎样写演讲稿
2014/01/04 职场文书
《会变的花树叶》教学反思
2014/02/10 职场文书
公路绿化方案
2014/05/12 职场文书
捐款感谢信
2015/01/20 职场文书
企业承诺书格式范文
2015/04/28 职场文书
股东出资协议书
2016/03/21 职场文书
协议书格式模板
2016/03/24 职场文书
Java处理延时任务的常用几种解决方案
2022/06/01 Java/Android