вопрос о функции python len

1

Я полный Python noob, поэтому, пожалуйста, простите мой простой вопрос. Я пытаюсь написать script, который найдет все последовательности в огромной строке, которые соответствуют ATxxxCA, ATxxxxCA, ATxxxxxCA или ATxxxxxxCA, где x может быть любым символом. Когда образец ATxxxCA сопоставляется, я хотел бы, чтобы script захватил предыдущие 10 и следующие 10 символов, окружающих сопоставленную ATxxxCA. Например, результат может выглядеть так: aaaaaaaaaaATxxxCAbbbbbbbbbb

Я попытался запустить script следующим образом:

SeqMatch = input("enter DNA sequence to search: ")
for s in re.findall(r'AT(.*?)CA', SeqMatch):
    if len(s) is < 10:
        print(s)
    else:
        print('no sequence matches')

Кажется, я делаю что-то неправильно в моем цикле if? Может ли кто-нибудь помочь? Спасибо заранее!

  • 1
    Я чувствую себя обязанным указать на BioPython - biopython.org/DIST/docs/tutorial/Tutorial.html#htoc16
  • 0
    Что происходит при исполнении? Что вы ожидаете случиться?
Показать ещё 1 комментарий
Теги:

3 ответа

1
Лучший ответ

Позаботьтесь о перекрытиях:

import re

adn = ('TCGCGCCCCCCCCCCATCAAGACATGGTTTTTTTTTTATTTATCAGATTACAGATACA'
       'GTTATGGGGGGGGGGATATACAGATGCATAGCGATTAGCCTAGCTA')


regx = re.compile('(.{10})(AT.{3,6}CA)(.{10})')
res = regx.findall(adn)
for u in res:
    print u

print

pat = re.compile('(.{10})(AT.{3,6}CA)')
li = []
for mat in pat.finditer(adn):
    x = mat.end()
    li.append(mat.groups()+(adn[x:x+10],))
for u in li:
    print u

результат

('CCCCCCCCCC', 'ATCAAGACA', 'TGGTTTTTTT')
('GGGGGGGGGG', 'ATATACA', 'GATGCATAGC')

('CCCCCCCCCC', 'ATCAAGACA', 'TGGTTTTTTT')
('TTTTTTTTTT', 'ATTTATCA', 'GATTACAGAT')
('GGGGGGGGGG', 'ATATACA', 'GATGCATAGC')
  • 0
    Фантастика, спасибо за помощь! Этот сайт и его участники действительно невероятны. Я ценю, что ты терпишь мои глупые вопросы о нубах!
1

Кажется, я что-то делаю неправильно мой цикл if?

Python не знает, что означает "is" (в этом контексте).

Удалите "is" из вашей проверки if,

if len(s) < 10:
    print(s)
else:
    print('no sequence matches')

Вы также сказали:

Когда шаблон ATxxxCA сопоставляется, я тогда было бы желательно, чтобы scriptзахватить предыдущие 10 и следующие 10 символы, окружающие сопоставленные ATxxxCA. Например, результат может выглядят так: aaaaaaaaaaATxxxCAbbbbbbbbbb

Если вы хотите захватить предыдущие и/или перенесенные (?) 10 символов, измените регулярное выражение на

 (.{10})AT(.*)CA(.{10})

Вы получите свои 10 как в одном результате, а затем материал между AT и CA, а затем ваши 10bs.

Или вы можете захватить все это, используя один набор пасетезов вокруг всего.

 (.{10}AT.*CA.{10})

Regexpal - это находка для создания/отладки регулярных выражений.

  • 1
    Предположительно, строка длинная и есть несколько совпадений. Таким образом, средний подстановочный знак должен быть не жадным.
  • 0
    Спасибо за указание на Regexpal и за всю помощь.
0

Вот пример:

s = "a"*20 + "ATxxxxCA" + "b"*20
rec = re.compile(r'(AT.{3,6}CA)')
mo = rec.search(s)
print s[mo.start()-10:mo.end()+10]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню