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通过shutil实现快速文件复制的方法
Mar 14 Python
在Django的URLconf中进行函数导入的方法
Jul 18 Python
python实现屏保计时器的示例代码
Aug 08 Python
Python多进程fork()函数详解
Feb 22 Python
谈谈Python中的while循环语句
Mar 10 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
Apr 05 Python
python基础教程之while循环
Aug 14 Python
Python定义函数时参数有默认值问题解决
Dec 19 Python
pytorch中nn.Conv1d的用法详解
Dec 31 Python
python中wx模块的具体使用方法
May 15 Python
解决Python3.8运行tornado项目报NotImplementedError错误
Sep 02 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
Oct 30 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删除数组中的特定元素的代码
2012/06/28 PHP
php+html5基于websocket实现聊天室的方法
2015/07/17 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
PHP简单装饰器模式实现与用法示例
2017/06/22 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
2019/05/06 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
jQuery 无限级菜单的简单实例
2014/02/21 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
2014/05/20 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
基于jQuery实现的QQ表情插件
2015/08/25 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
2016/06/24 Javascript
微信小程序 加载 app-service.js 错误解决方法
2016/10/12 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
一份超级详细的Vue-cli3.0使用教程【推荐】
2018/11/15 Javascript
使用Angular自定义字段校验指令的方法示例
2019/02/01 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
javascript canvas实现简易时钟例子
2020/09/05 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
JavaScript实现alert弹框效果
2020/11/19 Javascript
pygame游戏之旅 添加游戏介绍
2018/11/20 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
中国医药集团国药在线:国药网
2017/02/06 全球购物
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
为什么要使用servlet
2016/01/17 面试题
业务主管岗位职责范本
2013/12/25 职场文书
煤矿安全知识竞赛活动总结
2014/07/07 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
python内置进制转换函数的操作
2021/06/02 Python
Python使用Web框架Flask开发项目
2022/06/01 Python