簡體   English   中英

在Python中按開始和結束字符串值進行切片

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM