Nano Hash - криптовалюты, майнинг, программирование

Расщепление белка Regex

Итак, я расщепляю белковую последовательность с помощью фермента (для вашего любопытства, Asp-N), который расщепляет перед белками, кодируемыми B или D, в однобуквенной последовательности. Мой фактический анализ использует String#scan для захватов. Я пытаюсь понять, почему следующее регулярное выражение не переваривает его правильно...

(\w*?)(?=[BD])|(.*\b)

где антецедент (.*\b) существует для захвата конца последовательности. За:

MTMDKPSQYDKIEAELQDICNDVLELLDSKGDYFRYLSEVASGDN

Это должно дать что-то вроде: [MTM, DKPSQY, DKIEAELQ, DICN, DVLELL, DSKG, ... ], но вместо этого пропускает каждую D в последовательности.

Я использовал http://www.rubular.com для устранения неполадок, который работает на 1.8.7, хотя я также тестировал этот REGEX на 1.9.2 безрезультатно. Насколько я понимаю, утверждения с опережением нулевой ширины поддерживаются в обеих версиях ruby. Что я делаю неправильно с моим регулярным выражением?


  • Какой метод вы используете? String#scan, String#split или что-то еще? 19.05.2011
  • +1 Какой отличный вопрос. Я не ожидал результатов, которые вы получили, и дальнейший анализ научил меня кое-чему о том, как регулярное выражение обрабатывает повторяющиеся совпадения с нулевой шириной. 19.05.2011
  • Меня немного смущает ваше утверждение, которое расщепляет белки, кодируемые B или D. Насколько я понимаю, B — это однобуквенный код для либо D, либо N ( где неизвестно, является ли остаток Asp или Asn)? Может ли Asp-N расщепляться раньше Asn? 21.05.2011
  • @TomD Извините, если моя формулировка непонятна. Asp-N не расщепляется после Asn, но для целей анализа предполагается, что происходит расщепление, а не предположение, что B представляет собой N. Это увеличивает количество образующихся пептидных фрагментов, но гарантирует, что вы не пренебрегли возможный фрагмент. Имеет смысл, верно? 22.05.2011
  • @Ryanmt Хорошо, теперь я понял :-) Спасибо за это разъяснение. 22.05.2011
  • @Ryanmt Прочитав ваш вопрос, я попытался использовать Mathematica, чтобы ответить на него. Я обнаружил, что это не так просто, как могло показаться на первый взгляд, поэтому я опубликовал вариант тега Mathematica на SO. Вас могут заинтересовать ответы, особенно регулярное выражение один. (Исходный пример протеазы является гипотетическим!) 03.06.2011

Ответы:


1

Самый простой способ поддержать это — разбить просмотр вперед с нулевой шириной:

s = "MTMDKPSQYDKIEAELQDICNDVLELLDSKG"
p s.split /(?=[BD])/
#=> ["MTM", "DKPSQY", "DKIEAELQ", "DICN", "DVLELL", "DSKG"]

Чтобы понять, что пошло не так с вашим решением, давайте сначала посмотрим на ваше регулярное выражение, а не на то, которое работает:

p s.scan(/.*?(?=[BD]|$)/)
#=> ["MTM", "", "KPSQY", "", "KIEAELQ", "", "ICN", "", "VLELL", "", "SKG", ""]

p s.scan(/.+?(?=[BD]|$)/)
#=> ["MTM", "DKPSQY", "DKIEAELQ", "DICN", "DVLELL", "DSKG"]

Проблема в том, что если вы можете захватить ноль символов и по-прежнему совпадать с просмотром вперед с нулевой шириной, вы добьетесь успеха, не перемещая указатель сканирования. Давайте рассмотрим более простой, но похожий тестовый пример:

s = "abcd"
p s.scan //      # Match any position, without advancing
#=> ["", "", "", "", ""]

p s.scan /(?=.)/ # Anywhere that is followed by a character, without advancing
#=> ["", "", "", ""]

Наивная реализация String#scan может застрять в бесконечном цикле, многократно совпадая с указателем перед первым символом. Похоже, что как только совпадение происходит без продвижения указателя, алгоритм принудительно перемещает указатель на один символ. Это объясняет результаты в вашем случае:

  1. Сначала он соответствует всем символам до B или D,
  2. затем он соответствует позиции нулевой ширины прямо перед B или D без перемещения указателя символа,
  3. в результате алгоритм перемещает указатель за B или D и продолжает работу после этого.
19.05.2011
  • Возможно, мне следует упростить, поскольку другой ответ, кажется, работает, но это действительно то, что я искал: понимание! Спасибо за объяснение, почему мое регулярное выражение не работает! 19.05.2011
  • @Ryanmt Я рад, что смог помочь. Я также изменил свое регулярное выражение, чтобы показать вам более простой способ захвата конца последовательности, если вы хотите использовать это, а не более простое решение на основе разделения. 19.05.2011
  • Ах. Я читал об этом, но не применил к своей проблеме. Спасибо! 19.05.2011

  • 2

    По сути, вы хотите обрезать струну перед каждым B или D?

    "...".split(/(?=[BD])/)
    

    Дает тебе

    ["MTM", "DKPSQY", "DKIEAELQ", "DICN", "DVLELL", "DSKG", "DYFRYLSEVASG", "DN"]
    
    18.05.2011
  • Отличный ответ и чистый. Спасибо! 19.05.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..