2014-03-05 60 views
1

我有一個字符串,其中有我需要從中提取的某些值。例如:"FEFEWFSTARTFFFPENDDCDC"。我怎麼能做出一個表達式,從"START"一直到"END"Python中的開始和停止字符串值切片

我之前通過創建使用for循環和string.find("START")來定位開始和結束的函數來嘗試這樣做,但是這看起來沒有效果並且看起來過於複雜。有沒有更簡單的方法來做到這一點,而不使用複雜的循環?


編輯

忘記了這部分內容。如果有不同的最終值會怎麼樣?換句話說,而不是僅僅以"END"結尾,值"DONE""NOMORE"也將結束它?除此之外,整個字符串還有多個開始和結束。例如:"STARTFFEFFDONEFEWFSTARTFEFFENDDDW"

EDIT2:樣品運行:起始值:ATG。最終值:TAG,TAA,TGA

"Enter a string": TTATGTTTTAAGGATGGGGCGTTAGTT 
TTT 
GGGCGT 

而且

"Enter a string": TGTGTGTATAT 
"No string found" 
+0

使用'regex'也許? – Gogo

+1

在第二種情況下,如果「DONE」*和*'「END」都存在,例如, 「STARTabcDONEdefEND」'?如果有重疊,例如'「STARTabsSTARTdefENDghiEND」',該怎麼辦?你需要清楚你正在使用的「規則」。 – jonrsharpe

+0

我認爲這將有助於展示你的輸入和期望輸出的例子 – sotapme

回答

5

這對正則表達式的完美契合:

>>> import re 
>>> s = "FEFEWFSTARTFFFPENDDCDCSTARTDOINVOIJHSDFDONEDFOIER" 
>>> re.findall("START.*?(?:END|DONE|NOMORE)", s) 
['STARTFFFPEND', 'STARTDOINVOIJHSDFDONE'] 

.*匹配任何數目的字符(除換行),額外的?使量詞懶,告訴它匹配少量cha儘可能的。否則,將只有一個匹配,即STARTFFFPENDDCDCSTARTDOINVOIJHSDFDONE

由於@BurhanKhalid指出,如果添加capturing group,只能通過正則表達式的那部分匹配的字符串將被捕獲:

>>> 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) 
+1

只需添加,如果您只對兩個部分有興趣,可將表達式更改爲_capture group_,'re.findall('START(。*?)END',s)'會給你'['FFFP' ,'DOINVOIJHSDF']'作爲結果。 –

1
a="FEFEWFSTARTFFFPENDDCDC" 
a[a.find('START'):] 


'STARTFFFPENDDCDC' 
1

最簡單的方法(沒有循環,沒有正則表達式):

s = "FEFEWFSTARTFFFPENDDCDC" 
tmp = s[s.find("START") + len("START"):] 
result = tmp[:tmp.find("END")] 
+0

如果有不同的最終值會怎麼樣?換句話說,不是以「END」結束,「DONE」和「NOMORE」的值也會結束?除此之外,整個字符串還有多個開始和結束。例如: 「STARTFFEFFDONEFEWFSTARTFEFFENDDDW」 –

+0

如果您需要在上面的代碼中使用DONE和NOMORE替換START和END。如果有多個START-END子句,則需要循環或正則表達式。 –

1
yourString = 'FEFEWFSTARTFFFPENDDCDC' 
substring = yourString[yourString.find("START") + len("START") : yourString.find("END")] 
1

不就是有效的,但沒有工作。

>>> s = "FEFEWFSTARTFFFPENDDCDC" 
>>> s[s.index('START'):s.index('END')+len('END')] 
'STARTFFFPEND'