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代码做configure文件
Jul 20 Python
Python+MongoDB自增键值的简单实现
Nov 04 Python
基于DataFrame改变列类型的方法
Jul 25 Python
Python 忽略warning的输出方法
Oct 18 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
Aug 26 Python
如何使用Python发送HTML格式的邮件
Feb 11 Python
django迁移文件migrations的实现
Mar 31 Python
Numpy中ndim、shape、dtype、astype的用法详解
Jun 14 Python
pytorch 常用函数 max ,eq说明
Jun 28 Python
python如何删除列为空的行
Jul 17 Python
Python Socket多线程并发原理及实现
Dec 11 Python
pycharm 实现复制一行的快捷键
Jan 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
Apache设置虚拟WEB
2006/10/09 PHP
php 清除网页病毒的方法
2008/12/05 PHP
php中fgetcsv()函数用法实例
2014/11/28 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
2014/08/18 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
详解javascript new的运行机制
2016/01/26 Javascript
JS获取及验证开始结束日期的方法
2016/08/20 Javascript
JavaScript 详解预编译原理
2017/01/22 Javascript
Vue生命周期示例详解
2017/04/12 Javascript
使用 Vue.js 仿百度搜索框的实例代码
2017/05/09 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
vue实现学生录入系统之添加删除功能
2018/07/11 Javascript
深入理解使用Vue实现Context-Menu的思考与总结
2019/03/09 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
深入解读Node.js中的koa源码
2019/06/17 Javascript
如何给element添加一个抽屉组件的方法步骤
2019/07/14 Javascript
[05:34]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY第二弹
2014/06/25 DOTA
[01:06:39]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第三局
2016/03/02 DOTA
Python计算程序运行时间的方法
2014/12/13 Python
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
2016/11/19 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
Python txt文件常用读写操作代码实例
2020/08/03 Python
python连接mysql数据库并读取数据的实现
2020/09/25 Python
python中实现词云图的示例
2020/12/19 Python
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
校本教研工作方案
2014/01/14 职场文书
三严三实对照检查材料
2014/08/25 职场文书
委托书如何写
2014/08/30 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript
如何通过一篇文章了解Python中的生成器
2022/04/02 Python
win11如何查看端口是否被占用? Win11查看端口是否占用的技巧
2022/04/05 数码科技