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项目发布为exe可执行程序过程分享
Oct 23 Python
浅谈DataFrame和SparkSql取值误区
Jun 09 Python
对Python 内建函数和保留字详解
Oct 15 Python
PyCharm在新窗口打开项目的方法
Jan 17 Python
Python中时间datetime的处理与转换用法总结
Feb 18 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
Feb 21 Python
对Python的交互模式和直接运行.py文件的区别详解
Jun 29 Python
Python + OpenCV 实现LBP特征提取的示例代码
Jul 11 Python
Python Django 简单分页的实现代码解析
Aug 21 Python
使用pyqt5 tablewidget 单元格设置正则表达式
Dec 13 Python
浅谈Python程序的错误:变量未定义
Jun 02 Python
Django model class Meta原理解析
Nov 14 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堆排序实现原理与应用方法
2015/01/03 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
php实现在线通讯录功能(附源码)
2016/05/13 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
php-msf源码详解
2017/12/25 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
PHP使用Http Post请求发送Json对象数据代码解析
2020/07/16 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
2013/03/22 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
javascript瀑布流式图片懒加载实例
2020/06/28 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
Python中针对函数处理的特殊方法
2014/03/06 Python
Python科学计算环境推荐——Anaconda
2014/06/30 Python
跟老齐学Python之Python安装
2014/09/12 Python
python写的一个squid访问日志分析的小程序
2014/09/17 Python
通过python顺序修改文件名字的方法
2018/07/11 Python
Flask框架响应、调度方法和蓝图操作实例分析
2018/07/24 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
2019/02/22 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
Numpy中对向量、矩阵的使用详解
2019/10/29 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
高中生学习生活的自我评价
2013/10/09 职场文书
迟到检讨书大全
2014/01/25 职场文书
大学生旅游业创业计划书
2014/01/29 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
教师个人教学总结
2015/02/11 职场文书
微观世界观后感
2015/06/10 职场文书
小学大队委竞选口号
2015/12/25 职场文书
使用Redis实现秒杀功能的简单方法
2021/05/08 Redis