我有一个字符串,其中有一些需要从中提取的值。例如:"FEFEWFSTARTFFFPENDDCDC"。我怎么能做一个从"START"一直到"END"的切片的表达式?

我以前尝试通过创建使用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"

最佳答案

这非常适合正则表达式:

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

10-07 12:43
查看更多