我有一个字符串,我需要从中提取某些值。例如:“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)
