Python查找第n個(gè)子串的技巧分享
Problem
Python中str類自帶的find、index方法可以返回第一個(gè)匹配的子串的位置,但是如果實(shí)際使用中需要查找第2個(gè)甚至第n個(gè)子串的位置該怎么辦呢。也許有的碼友可能會(huì)用到第二第三個(gè)參數(shù),指定查找的起始、終止位置。但是在很多情況下,接收到的一個(gè)字符串可能是未知的,強(qiáng)制限定起始位置可能導(dǎo)致代碼在某些情況下不能適用。
Solution
采用嵌套的方法調(diào)用find或者index。
str_exp = "aaabbbbccc" pos_n = str_exp.index("a", str_exp.index("a")+1) print(pos_n)
原理很簡(jiǎn)單,第一次查找返回的位置加1作為第二次查找的起始參數(shù)。加1是因?yàn)閟tart參數(shù)位置是被包含的,采用的閉區(qū)間的語義。也不用擔(dān)心會(huì)越界,python底層已經(jīng)做了處理。
也可以寫一個(gè)單獨(dú)的函數(shù)來進(jìn)行查找操作。
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個(gè)子串,從0開始。start為起始位置。此處使用find而不用index是因?yàn)閕ndex在查找失敗時(shí)會(huì)報(bào)出異常,而find不報(bào)異常返回-1。從健壯性考慮使用find。
看來遞歸使用起來還是可以解決很多編程實(shí)踐過程中遇到的工程問題。:)
Attention
1、左閉右開特性
str.index(self, sub, start=None, end=None) str_tmp[start:end]
默認(rèn)的是左閉右開,即包含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是不會(huì)報(bào)出異常的,即查找子串失敗的情況下返回-1,而index在查找子串失敗時(shí)會(huì)報(bào)異常。
示例如下:
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個(gè)子串的技巧分享就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python 基于 pygame 實(shí)現(xiàn)輪播圖動(dòng)畫效果
在Python中可以適應(yīng)第三方庫pygame來實(shí)現(xiàn)輪播圖動(dòng)畫的效果,使用pygame前需確保其已經(jīng)安裝,本文通過實(shí)例代碼介紹Python 基于 pygame 實(shí)現(xiàn)輪播圖動(dòng)畫效果,感興趣的朋友跟隨小編一起看看吧2024-03-03Python3對(duì)稱加密算法AES、DES3實(shí)例詳解
這篇文章主要介紹了Python3對(duì)稱加密算法AES、DES3,結(jié)合實(shí)例形式詳細(xì)分析了對(duì)稱加密算法AES、DES3相關(guān)模塊安裝、使用技巧與操作注意事項(xiàng),需要的朋友可以參考下2018-12-12使用Flink與Python進(jìn)行實(shí)時(shí)數(shù)據(jù)處理的基本步驟
Apache Flink是一個(gè)流處理框架,用于實(shí)時(shí)處理和分析數(shù)據(jù)流,PyFlink是Apache Flink的Python API,它允許用戶使用Python語言來編寫Flink作業(yè),進(jìn)行實(shí)時(shí)數(shù)據(jù)處理,以下是如何使用Flink與Python進(jìn)行實(shí)時(shí)數(shù)據(jù)處理的基本步驟,需要的朋友可以參考下2024-09-09python爬蟲開發(fā)之Beautiful Soup模塊從安裝到詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python爬蟲開發(fā)之Beautiful Soup模塊詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03一文深入了解Python中的繼承知識(shí)點(diǎn)
Python?是面向?qū)ο蟮木幊陶Z言,因此支持面向?qū)ο蟮娜筇匦灾唬豪^承。本文就帶大家了解了解Python中繼承的相關(guān)知識(shí)點(diǎn),感興趣的可以了解一下2022-11-11Python實(shí)現(xiàn)批量獲取當(dāng)前文件夾下的文件名
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)批量獲取當(dāng)前文件夾下的文件名,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02