Python查找第n个子串的技巧分享


Posted in Python onJune 27, 2018

Problem

Python中str类自带的find、index方法可以返回第一个匹配的子串的位置,但是如果实际使用中需要查找第2个甚至第n个子串的位置该怎么办呢。也许有的码友可能会用到第二第三个参数,指定查找的起始、终止位置。但是在很多情况下,接收到的一个字符串可能是未知的,强制限定起始位置可能导致代码在某些情况下不能适用。

Solution

采用嵌套的方法调用find或者index。

str_exp = "aaabbbbccc"
 pos_n = str_exp.index("a", str_exp.index("a")+1)
 print(pos_n)

原理很简单,第一次查找返回的位置加1作为第二次查找的起始参数。加1是因为start参数位置是被包含的,采用的闭区间的语义。也不用担心会越界,python底层已经做了处理。

也可以写一个单独的函数来进行查找操作。

def find_n_sub_str(src, sub, pos, start):
 index = src.find(sub, start)
 if index != -1 and pos > 0:
  return find_n_sub_str(src, sub, pos - 1, index + 1)
 return index

pos表示第n个子串,从0开始。start为起始位置。此处使用find而不用index是因为index在查找失败时会报出异常,而find不报异常返回-1。从健壮性考虑使用find。

看来递归使用起来还是可以解决很多编程实践过程中遇到的工程问题。:)

Attention

1、左闭右开特性

str.index(self, sub, start=None, end=None)
str_tmp[start:end]

默认的是左闭右开,即包含start的位置,却不包含end的位置。在使用过程中需要注意一下。同样左闭右开的还有切片操作str_tmp[start:end]。

示例如下:

str_exp = "aaabbbbccc"
 print(str_exp)
 print(str_exp[str_exp.index("a"):str_exp.rindex("c")])
aaabbbbccc
aaabbbbcc

2、find与index差别

find是不会报出异常的,即查找子串失败的情况下返回-1,而index在查找子串失败时会报异常。

示例如下:

str_tmp = "aaaabbbbccccdddd"
 print(find_n_sub_str(str_tmp, "a", 5, 0))
 print(str_tmp.find("a", 7))
 print(str_tmp.index("a", 7))
-1
-1
Traceback (most recent call last):
 File "/usr/local/pycharm-community-5.0.4/helpers/pydev/pydevd.py", line 2411, in <module>
 globals = debugger.run(setup['file'], None, None, is_module)
 File "/usr/local/pycharm-community-5.0.4/helpers/pydev/pydevd.py", line 1802, in run
 launch(file, globals, locals) # execute the script
 File "/usr/local/pycharm-community-5.0.4/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
 exec(compile(contents+"\n", file, 'exec'), glob, loc) 
 File "/usr/local/workspace/pycharmPro/StockAI/StockAI/DbDealer.py", line 140, in <module>
 print(str_tmp.index("a", 7))
ValueError: substring not found

以上这篇Python查找第n个子串的技巧分享就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 捕获 shell/bash 脚本的输出结果实例
Jan 04 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
Python内置函数reversed()用法分析
Mar 20 Python
python web基础之加载静态文件实例
Mar 20 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
Jun 04 Python
python获取代码运行时间的实例代码
Jun 11 Python
python 堆和优先队列的使用详解
Mar 05 Python
Django框架反向解析操作详解
Nov 28 Python
13个Pandas实用技巧,助你提高开发效率
Aug 19 Python
Python日志打印里logging.getLogger源码分析详解
Jan 17 Python
selenium.webdriver中add_argument方法常用参数表
Apr 08 Python
python中的class_static的@classmethod的巧妙用法
Jun 22 Python
python numpy 部分排序 寻找最大的前几个数的方法
Jun 27 #Python
获取python的list中含有重复值的index方法
Jun 27 #Python
Python 查找list中的某个元素的所有的下标方法
Jun 27 #Python
Python实现在某个数组中查找一个值的算法示例
Jun 27 #Python
使用Python对微信好友进行数据分析
Jun 27 #Python
python实现列表中由数值查到索引的方法
Jun 27 #Python
numpy返回array中元素的index方法
Jun 27 #Python
You might like
php 归并排序 数组交集
2011/05/10 PHP
PHP取整数函数常用的四种方法小结
2012/07/05 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
PHP与jquery实时显示网站在线人数实例详解
2016/12/02 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
学习ExtJS(一) 之基础前提
2009/10/07 Javascript
javascript通过className来获取元素的简单示例代码
2014/01/10 Javascript
基于JS实现的倒计时程序实例
2015/07/24 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
2017/05/03 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
2017/05/24 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
Vue 使用中的小技巧
2018/04/26 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
webpack打包react项目的实现方法
2018/06/21 Javascript
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
2019/09/03 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
[01:16:13]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第一场 2月22日
2021/03/11 DOTA
python中global用法实例分析
2015/04/30 Python
wxPython定时器wx.Timer简单应用实例
2015/06/03 Python
Python3基于sax解析xml操作示例
2018/05/22 Python
从0开始的Python学习016异常
2019/04/08 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
出纳岗位职责模板
2013/11/27 职场文书
新闻传媒系求职信范文
2014/04/19 职场文书
团队精神的演讲稿
2014/05/14 职场文书
团日活动总结报告
2014/06/25 职场文书
优秀团员事迹材料1500字
2014/08/31 职场文书
优秀共产党员演讲稿
2014/09/04 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
青年文明号申报材料
2014/12/23 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
在职证明范本
2015/06/15 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
2016思想纪律作风整顿心得体会
2016/01/23 职场文书
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python