在Python中通过开始和结束字符串切片
我有一个字符串,其中包含一些我需要提取的值。例如:"FEFEWFSTARTFFFPENDDCDC"
。我该如何写一个表达式,从"START"
开始,一直到"END"
结束,提取出这部分内容呢?
我之前尝试过创建一些函数,使用for
循环和string.find("START")
来找到开始和结束的位置,但这样做似乎不太有效,而且显得太复杂了。有没有更简单的方法,不用复杂的循环呢?
补充说明:
我忘了提这一点。如果有不同的结束值该怎么办?换句话说,不仅仅是以"END"
结束,"DONE"
和"NOMORE"
也可以作为结束值?而且在这个字符串中,可能会有多个开始和结束的地方。例如:"STARTFFEFFDONEFEWFSTARTFEFFENDDDW"
。
补充2:示例运行:开始值:ATG。结束值:TAG、TAA、TGA
"Enter a string": TTATGTTTTAAGGATGGGGCGTTAGTT
TTT
GGGCGT
还有
"Enter a string": TGTGTGTATAT
"No string found"
5 个回答
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如说,当你在写代码时,可能会发现某些功能没有按预期工作。这时候,你可能会去网上查找解决方案,比如在StackOverflow上提问或寻找答案。
在这些讨论中,大家会分享他们的经验和解决方案。有些人可能会提供代码示例,帮助你更好地理解如何解决问题。比如,他们可能会给出一些代码块,像
yourString = 'FEFEWFSTARTFFFPENDDCDC'
substring = yourString[yourString.find("START") + len("START") : yourString.find("END")]
,这些代码块通常是用来展示具体的实现方式或解决方案。
总之,编程过程中遇到问题是很正常的,利用社区的力量来寻找答案和学习是一个很好的方法。
简单的方法(不使用循环,也不使用正则表达式):
s = "FEFEWFSTARTFFFPENDDCDC"
tmp = s[s.find("START") + len("START"):]
result = tmp[:tmp.find("END")]
a="FEFEWFSTARTFFFPENDDCDC"
a[a.find('START'):]
'STARTFFFPENDDCDC'
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。
虽然效率不是很高,但确实能用。
>>> s = "FEFEWFSTARTFFFPENDDCDC"
>>> s[s.index('START'):s.index('END')+len('END')]
'STARTFFFPEND'
这正好适合用正则表达式来处理:
>>> 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)