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 sys模块sys.path使用方法示例
Dec 04 Python
浅析Python中的for 循环
Jun 09 Python
Python实现ssh批量登录并执行命令
Oct 25 Python
python实现关键词提取的示例讲解
Apr 28 Python
python print输出延时,让其立刻输出的方法
Jan 07 Python
python重试装饰器的简单实现方法
Jan 31 Python
Python产生一个数值范围内的不重复的随机数的实现方法
Aug 21 Python
Django中的FBV和CBV用法详解
Sep 15 Python
python文件和文件夹复制函数
Feb 07 Python
python对一个数向上取整的实例方法
Jun 18 Python
Numpy实现卷积神经网络(CNN)的示例
Oct 09 Python
ASP.NET Core中的配置详解
Feb 05 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
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
使用隐藏的new来创建对象
2011/03/29 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
2016/11/29 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
最新Javascript程序员面试试题和解题方法
2017/11/23 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
微信小程序实现选项卡效果
2018/11/06 Javascript
JavaScript封闭函数及常用内置对象示例
2019/05/13 Javascript
javascript的this关键字详解
2019/05/20 Javascript
JS多个异步请求 按顺序执行next实现解析
2019/09/16 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
基于VSCode调试网页JavaScript代码过程详解
2020/07/20 Javascript
基于JS实现计算24点算法代码实例解析
2020/07/23 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
[58:15]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 NB vs Liquid
2018/04/02 DOTA
python paramiko实现ssh远程访问的方法
2013/12/03 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
TensorFlow中权重的随机初始化的方法
2018/02/11 Python
Python Pillow Image Invert
2019/01/22 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
Python中私有属性的定义方式
2020/03/05 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
简历自我评价怎么写呢?
2014/01/06 职场文书
消防应急演练方案
2014/02/12 职场文书
班组建设经验交流材料
2014/05/12 职场文书
授权委托书(完整版)
2014/09/10 职场文书
房屋所有权证明
2014/10/20 职场文书
2015年校本培训工作总结
2015/07/24 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis