2013-10-23 3 views
0

BioPython의 Seq 객체 목록이 있는데이 시퀀스 내에서 아미노산 서열 모티브를 검색하려고합니다. 이 시퀀스를 검색하는 가장 좋은 방법은 무엇입니까? 내 검색은 GxxxG와 같은 모티프를 찾는 것이지만 길거나 짧을 수 있지만 첫 번째 G 이후의 다음 G의 첫 번째 인스턴스에서 멈출 수 있습니다. G. * G와 같은 정규 표현식을 사용하면 첫 번째 결과 G 마지막으로 발견 된 아미노산의 수에 상관없이 G.BioPython : Seq 객체 컬렉션에서 모티프를 검색하는 방법

#Some example code 
from Bio.Seq import Seq 
from Bio.Alphabet import IUPAC 
import re 

records = Seq("WALLLLFWLGWLGMLAGAVVIIVR", IUPAC.extended_protein) 

search = re.search("F.*G", str(records)) 
print search.group() 
# Want FWLG 
# Get 
FWLGWLGMLAG 

답변

2

게으른 성냥이 필요합니다.

ABBBBBBBBBBBBBE 
^-------------^ 

"는 일치하지 않습니다"와 노력 하나 개의 문자가는 적은

ABBBBBBBBBBBBBE 
^------------^ 

그는 않습니다 "가는을 :

A.의 *의 B 주어진 ABBBBBBBBBBBBBE하지만 일치하도록 노력으로 될 수 일치 "를 반환하고 그것을 반환

게으른 일치 A.*?B 가능한 한 시도하고 일치합니다. 이 경우 :

ABBBBBBBBBBBBBE 
^^ 

A와 0 문자는 B, 그리고 "그것은 일치이다"와 같은 것 그냥

AB를 반환? 일반적으로 선택 사항을 의미하지만 *는 한정 기호 (0 이상)입니까? 게으르다.

당신은 게으른 한정사가 느린 방법으로 사용 F.*?G

+0

무엇 귀하의 예제에서, 사이의 문자 중 하나 이상이있을 필요가있는 경우에 대한 A와 비? 따라서 출력은 적어도 A.B가되고 싶습니다. – Kevin

+1

@Kev 당신은 +1 이상을 사용할 수 있습니다. *가 0 이상입니까? 1 또는 0 (선택 사항) 인 경우 {5}를 5 회 이상 사용하거나 {5,7}을 5 ~ 7 회 사용 할 수 있습니다. –

0

합니다. G의 첫 번째 발생을 멈추려면 점 대신 부정 문자 클래스를 사용할 수 있습니다. 예 :

F[^G]*G 

[^G] 다음 당신은 욕심 한정 기호를 사용할 수 있습니다 G

를 제외한 모든 문자를 의미합니다.

는이 코드와 다른 패턴을 테스트 할 수 있습니다, 속도 이득의 아이디어를 가지고 :

import re 
import cProfile 

s = r'ACATCATCTATCTATACAATAAAAACTATCCCCTAACTACTACACTACTATCATCACATCATATCACTTTATATCCTAC' 
for i in range(1,15): 
    s = s + s 

s = r'F' + s 
s = s + r'ATCTATCTATACAATAATCTATCTATACAATAATCTATCGATCTATCTATACAATAATCTATCTATACAATATCG' + s 

cProfile.run('re.search(r"F[^G]+G",s)') 
관련 문제