在Python中通过开始和结束字符串切片

1 投票
5 回答
2258 浏览
提问于 2025-04-17 20:56

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

1

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如说,当你在写代码时,可能会发现某些功能没有按预期工作。这时候,你可能会去网上查找解决方案,比如在StackOverflow上提问或寻找答案。

在这些讨论中,大家会分享他们的经验和解决方案。有些人可能会提供代码示例,帮助你更好地理解如何解决问题。比如,他们可能会给出一些代码块,像

yourString = 'FEFEWFSTARTFFFPENDDCDC'
substring = yourString[yourString.find("START") + len("START") : yourString.find("END")]
,这些代码块通常是用来展示具体的实现方式或解决方案。

总之,编程过程中遇到问题是很正常的,利用社区的力量来寻找答案和学习是一个很好的方法。

1

简单的方法(不使用循环,也不使用正则表达式):

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


'STARTFFFPENDDCDC'

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

1

虽然效率不是很高,但确实能用。

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

这正好适合用正则表达式来处理:

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

撰写回答