我有一个字符串,其中有我需要从中提取的某些值。例如:"FEFEWFSTARTFFFPENDDCDC"
.我怎样才能做出一个从"START"
一直到"END"
切片的表情?
我之前尝试通过创建使用 for
循环和string.find("START")
来定位开头和结尾的函数来执行此操作,但这似乎没有有效工作并且似乎过于复杂。有没有更简单的方法可以在不使用复杂循环的情况下做到这一点?
编辑:
忘记了这部分。如果有不同的结束值怎么办?换句话说,不仅仅是以"END"
结尾,"DONE"
和"NOMORE"
的值也会结束它吗?除此之外,整个字符串有多个开始和结束。例如:"STARTFFEFFDONEFEWFSTARTFEFFENDDDW"
.
编辑2:示例运行:起始值:ATG。结束值:标记,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'