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的面向对象思想分析
Jan 14 Python
python实现获取客户机上指定文件并传输到服务器的方法
Mar 16 Python
virtualenv实现多个版本Python共存
Aug 21 Python
python装饰器实例大详解
Oct 25 Python
python 将md5转为16字节的方法
May 29 Python
flask中过滤器的使用详解
Aug 01 Python
python3 爬取图片的实例代码
Nov 06 Python
用Python编写一个简单的CS架构后门的方法
Nov 20 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
Nov 29 Python
python 日志 logging模块详细解析
Mar 31 Python
对Matlab中共轭、转置和共轭装置的区别说明
May 11 Python
Python基础之条件语句详解
Jun 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
ThinkPHP中实例Model方法的区别说明
2010/08/21 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
Javascript 面向对象特性
2009/12/28 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
使用js如何实现全选与全不选
2013/12/30 Javascript
JS数组去重与取重的示例代码
2014/01/24 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
jQuery EasyUI 折叠面板accordion的使用实例(分享)
2017/12/25 jQuery
uni-app 组件里面获取元素宽高的实现
2019/12/27 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
python3之微信文章爬虫实例讲解
2017/07/12 Python
python利用微信公众号实现报警功能
2018/06/10 Python
django如何连接已存在数据的数据库
2018/08/14 Python
python集合是否可变总结
2019/06/20 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
Python基于字典实现switch case函数调用
2020/07/22 Python
美国校园市场:OCM
2017/06/08 全球购物
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
工业设计专业推荐信
2013/10/29 职场文书
中国梦的演讲稿
2014/01/08 职场文书
食堂厨师岗位职责
2014/08/25 职场文书
银行业务授权委托书
2014/10/10 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python
口袋妖怪冰系十大最强精灵,几何雪花排第七,第六类似北极熊
2022/03/18 日漫