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中的一些高级编程技巧
Apr 02 Python
Python socket编程实例详解
May 27 Python
分享Python开发中要注意的十个小贴士
Aug 30 Python
基于Python和Scikit-Learn的机器学习探索
Oct 16 Python
Python实现的绘制三维双螺旋线图形功能示例
Jun 23 Python
Djang的model创建的字段和参数详解
Jul 27 Python
python实现梯度下降和逻辑回归
Mar 24 Python
python3.6使用SMTP协议发送邮件
May 20 Python
python如何删除列为空的行
Jul 17 Python
python使用XPath解析数据爬取起点小说网数据
Apr 22 Python
一起来学习Python的元组和列表
Mar 13 Python
Python学习之异常中的finally使用详解
Mar 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 中英文语言转换类
2011/09/07 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
2013/04/26 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
jquery trim() 功能源代码
2011/02/14 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
常用的 JS 排序算法 整理版
2018/04/05 Javascript
使用Vue实现图片上传的三种方式
2018/07/17 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
微信小程序 JS动态修改样式的实现方法
2018/12/16 Javascript
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
深入讲解Python中的迭代器和生成器
2015/10/26 Python
Python简单连接MongoDB数据库的方法
2016/03/15 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
树莓派用python中的OpenCV输出USB摄像头画面
2019/06/22 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
取保候审保证书
2014/04/30 职场文书
计算机网络专业求职信
2014/06/05 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
2014年党员自我评价材料
2014/09/22 职场文书
九年级数学教学反思
2016/02/17 职场文书
八年级作文之我的母亲
2019/12/10 职场文书
一条慢SQL语句引发的改造之路
2022/03/16 MySQL