在Python中通过启动和停止字符串值进行切片

时间:2014-03-05 11:52:29

标签: python string

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

5 个答案:

答案 0 :(得分:5)

这非常适合正则表达式:

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

答案 1 :(得分:1)

a="FEFEWFSTARTFFFPENDDCDC"
a[a.find('START'):]


'STARTFFFPENDDCDC'

答案 2 :(得分:1)

简单的方法(没有循环,没有正则表达式):

s = "FEFEWFSTARTFFFPENDDCDC"
tmp = s[s.find("START") + len("START"):]
result = tmp[:tmp.find("END")]

答案 3 :(得分:1)

yourString = 'FEFEWFSTARTFFFPENDDCDC'
substring = yourString[yourString.find("START") + len("START") : yourString.find("END")]

答案 4 :(得分:1)

效率不高但确实有效。

>>> s = "FEFEWFSTARTFFFPENDDCDC"
>>> s[s.index('START'):s.index('END')+len('END')]
'STARTFFFPEND'