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搜索指定目录的方法
Apr 29 Python
Python获取邮件地址的方法
Jul 10 Python
Tensorflow中的placeholder和feed_dict的使用
Jul 09 Python
python的pytest框架之命令行参数详解(下)
Jun 27 Python
python之pexpect实现自动交互的例子
Jul 25 Python
PyCharm2018 安装及破解方法实现步骤
Sep 09 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
Jan 10 Python
解决TensorFlow模型恢复报错的问题
Feb 06 Python
使用Tkinter制作信息提示框
Feb 18 Python
详细分析Python可变对象和不可变对象
Jul 09 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
Dec 04 Python
python爬不同图片分别保存在不同文件夹中的实现
Apr 02 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中file_get_contents高?用法实例
2014/09/24 PHP
PHP判断数据库中的记录是否存在的方法
2014/11/14 PHP
php使用iconv中文截断问题的解决方法
2015/02/11 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
Javascript 面向对象(三)接口代码
2012/05/23 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
2015/06/10 Javascript
JS实现网页上随机产生超链接地址的方法
2015/11/09 Javascript
JavaScript 七大技巧(一)
2015/12/13 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
2016/09/24 Javascript
jquery 动态增加删除行的简单实例(推荐)
2016/10/12 Javascript
简单实现Bootstrap标签页
2020/08/09 Javascript
老生常谈的跨域处理
2017/01/11 Javascript
原生js实现可拖拽效果
2017/02/28 Javascript
js实现抽奖效果
2017/03/27 Javascript
详解Webpack DLL用法以及功能
2017/07/11 Javascript
微信小程序实现动态显示和隐藏某个控件功能示例
2018/12/14 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
Python isinstance函数介绍
2015/04/14 Python
python使用reportlab实现图片转换成pdf的方法
2015/05/22 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
2018/10/26 Python
详解python运行三种方式
2019/05/13 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
python ubplot使用方法解析
2020/01/10 Python
给民警的表扬信
2014/01/08 职场文书
职工运动会感言
2014/02/07 职场文书
感恩节红领巾广播稿
2014/02/11 职场文书
html+css实现环绕倒影加载特效
2021/07/07 HTML / CSS
SpringBoot接入钉钉自定义机器人预警通知
2022/07/15 Java/Android