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 22 Python
Python语言的面相对象编程方式初步学习
Mar 12 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
Aug 08 Python
Anaconda入门使用总结
Apr 05 Python
Python pygorithm模块用法示例【常见算法测试】
Aug 16 Python
Python简单过滤字母和数字的方法小结
Jan 09 Python
对python以16进制打印字节数组的方法详解
Jan 24 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
Python实现京东秒杀功能代码
May 16 Python
Python Pandas 箱线图的实现
Jul 23 Python
python第三方库学习笔记
Feb 07 Python
python 实现字符串下标的输出功能
Feb 13 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
深入extjs与php参数交互的详解
2013/06/25 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
PHP获取文件相对路径的方法
2015/02/26 PHP
laravel 修改.htaccess文件 重定向public的解决方法
2019/10/12 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
基于php+MySql实现学生信息管理系统实例
2020/08/04 PHP
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
js实现图片和链接文字同步切换特效的方法
2015/02/20 Javascript
JavaScript控制table某列不显示的方法
2015/03/16 Javascript
jQuery判断一个元素是否可见的方法
2015/06/05 Javascript
javascript实现的简单计时器
2015/07/19 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
JS创建对象的写法示例
2016/11/04 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
2017/11/11 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
2020/05/25 Javascript
Python处理JSON数据并生成条形图
2016/08/05 Python
Tensorflow分类器项目自定义数据读入的实现
2019/02/05 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
2019/03/05 Python
Python 获取 datax 执行结果保存到数据库的方法
2019/07/11 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
2020/04/10 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
Python ConfigParser模块的使用示例
2020/10/12 Python
python绘制汉诺塔
2021/03/01 Python
DHC美国官网:日本通信销售第一的化妆品品牌
2017/11/12 全球购物
真正的英国宝藏:Mappin & Webb
2019/05/05 全球购物
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
小班重阳节活动方案
2014/02/08 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
2014年团工作总结
2014/11/27 职场文书
财政局长个人总结
2015/03/04 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
nginx共享内存的机制详解
2022/03/21 Servers
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技