[英]Slicing by start and stop string values in Python
我有一個字符串,其中有一些需要從中提取的值。 例如: "FEFEWFSTARTFFFPENDDCDC"
。 我如何做出一個從"START"
一直到"END"
的片段?
我以前嘗試通過創建使用for
循環和string.find("START")
來定位開始和結束的函數來執行此操作,但這似乎沒有有效地工作,並且看起來過於復雜。 有沒有更簡單的方法而無需使用復雜的循環?
編輯 :
忘記了這部分。 如果最終值不同,該怎么辦? 換句話說,值"DONE"
和"NOMORE"
會以"END"
結尾,還會結束嗎? 除此之外,整個字符串中還有多個開始和結束。 例如: "STARTFFEFFDONEFEWFSTARTFEFFENDDDW"
。
EDIT2:樣品運行:起始值:ATG。 最終值:TAG,TAA,TGA
"Enter a string": TTATGTTTTAAGGATGGGGCGTTAGTT
TTT
GGGCGT
和
"Enter a string": TGTGTGTATAT
"No string found"
這非常適合正則表達式:
>>> import re
>>> s = "FEFEWFSTARTFFFPENDDCDCSTARTDOINVOIJHSDFDONEDFOIER"
>>> re.findall("START.*?(?:END|DONE|NOMORE)", s)
['STARTFFFPEND', 'STARTDOINVOIJHSDFDONE']
.*
匹配任意數量的字符(換行符除外),以及其他字符?
使量詞變得懶惰,告訴它盡可能少地匹配字符。 否則,將只有一個匹配項,即STARTFFFPENDDCDCSTARTDOINVOIJHSDFDONE
。
如@BurhanKhalid所指出的,如果添加捕獲組 ,則僅捕獲與正則表達式的該部分匹配的子字符串:
>>> re.findall("START(.*?)(?:END|DONE|NOMORE)", s)
['FFFP', 'DOINVOIJHSDF']
說明:
START # Match "START"
( # Match and capture in group number 1:
.*? # Any character, any number of times, as few as possible
) # End of capturing group 1
(?: # Start a non-capturing group that matches...
END # "END"
| # or
DONE # "DONE"
| # or
NOMORE # "NOMORE"
) # End of non-capturing group
如果您的真正目標是匹配基因序列,則需要確保始終匹配三胞胎:
re.findall("ATG(?:.{3})*?(?:TA[AG]|TGA)", s)
a="FEFEWFSTARTFFFPENDDCDC"
a[a.find('START'):]
'STARTFFFPENDDCDC'
簡單方法(無循環,無正則表達式):
s = "FEFEWFSTARTFFFPENDDCDC"
tmp = s[s.find("START") + len("START"):]
result = tmp[:tmp.find("END")]
yourString = 'FEFEWFSTARTFFFPENDDCDC'
substring = yourString[yourString.find("START") + len("START") : yourString.find("END")]
效率不高,但確實有效。
>>> s = "FEFEWFSTARTFFFPENDDCDC"
>>> s[s.index('START'):s.index('END')+len('END')]
'STARTFFFPEND'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.