Skip to main content
 首页 » 编程设计

python之在 Python 中按开始和停止字符串值切片

2025年05月04日12java哥

我有一个字符串,我需要从中提取某些值。例如:“FEFEWFSTARTFFFPENDDCDC”。我怎样才能创建一个表达式,从 "START" 一直截取到 "END"?

我之前尝试通过创建使用 for 循环和 string.find("START") 来定位开始和结束的函数来做到这一点,但这并没有它似乎无法有效工作,而且似乎过于复杂。有没有更简单的方法可以在不使用复杂循环的情况下做到这一点?


编辑:

忘了这部分。如果有不同的最终值怎么办?换句话说,不是仅仅以 "END" 结尾,值 "DONE" 和 "NOMORE" 也会结束它吗?除此之外,整个字符串中还有多个起点和终点。例如:“STARTFFFEFDONEFEWFSTARTFEFFENDDDW”。

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 指出的那样,如果您添加 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)