От новичка до гуру: Курсы программирования на CyberDuff

извлечение нескольких перекрывающихся подстрок

у меня есть такие цепочки аминокислот:

x <- "MEALYRAQVLVDLT*MQLPSSFAALAAQFDQL*EKEKF*SLIARSLHRPQ**LLMFSLLVASVFTPCSALPFWSIKFTLFILS*SFLISDSILFIRVIDQEIKYVVPL*DLK*LTPDYCKCD*"

и я хотел бы извлечь все непересекающиеся подстроки, начиная с M и заканчивая *. Итак, для приведенного выше примера мне понадобится:

#[1] "MEALYRAQVLVDLT*"
#[2] "MQLPSSFAALAAQFDQL*"
#[3] "MFSLLVASVFTPCSALPFWSIKFTLFILS*"

как выход. предсказуемо regexpr дает мне жадное решение:

  regmatches(x, regexpr("M.+\\*", x))
 #[1] "MEALYRAQVLVDLT*MQLPSSFAALAAQFDQL*EKEKF*SLIARSLHRPQ**LLMFSLLVASVFTPCSALPFWSIKFTLFILS*SFLISDSILFIRVIDQEIKYVVPL*DLK*LTPDYCKCD*"

я также пробовал вещи, предложенные здесь, так как это вопрос, который больше всего напоминает мою проблему (но не совсем), но безрезультатно.

любая помощь будет оценена.

19.10.2015

  • Вы пробовали нежадный? М.+?\* 19.10.2015
  • нет, но кто-то только что предложил это в ответе ниже, и это работает! 19.10.2015
  • Я не понимаю, вы говорите, что знаете разницу между greedy и non-greedy? Как это может быть ? 19.10.2015
  • @Frank - я никогда не видел учебника по регулярным выражениям, который объясняет greedy без объяснения non-greedy. Одно не может существовать без другого. 19.10.2015
  • @Frank - Жадность следует за квантификаторами. Квантификаторы никогда не объясняются без жадности, знать одно — значит знать другое. 19.10.2015
  • @sln Anywho, я удалю свои комментарии через несколько минут (чтобы убрать шум). Если есть что сказать, меня легко найти в общедоступном чате R. 19.10.2015

Ответы:


1

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

regmatches(x, gregexpr("M[^M]+?\\*", x))[[1]]
#[1] "MEALYRAQVLVDLT*"               
#[2] "MQLPSSFAALAAQFDQL*"            
#[3] "MFSLLVASVFTPCSALPFWSIKFTLFILS*"
19.10.2015
  • да, это работает, даже с прерывистыми Ms - спасибо 19.10.2015

  • 2

    Используйте нежадный .+? вместо .+ и переключитесь на gregexpr для несколько совпадений:

    R> regmatches(x, gregexpr("M.+?\\*", x))[[1]]
    #"MEALYRAQVLVDLT*"                
    #"MQLPSSFAALAAQFDQL*"             
    #"MFSLLVASVFTPCSALPFWSIKFTLFILS*"
    
    19.10.2015
  • спасибо, это идеально! я пробовал gregexpr раньше, просто забыл включить в описание моего вопроса. но это был нежадный .+, который сделал свое дело. 19.10.2015
  • Вы сказали не пересекающиеся. Это не удается x <- "MABC*MabcMdef*ghi*" 19.10.2015

  • 3
    M[^*]+\\*
    

    используйте отрицательный класс символов. См. демонстрацию. Также используйте опцию perl=True.

    https://regex101.com/r/tD0dU9/6

    19.10.2015
  • Благодарность! это работает отлично. я пытался отрицать *, но не понимал, что тогда мне не нужно было . и т. д. 19.10.2015
  • Отлично работает (дает тот же результат, что и другой ответ) без perl=TRUE. Кроме того, в R вам придется писать все заглавными буквами. 19.10.2015
  • @Frank, мы можем использовать M[^M*]+\\*, когда другой ответ не сработает на MABC*MabcMdef*ghi* 19.10.2015
  • @vks Хорошо. Возможно, слишком поздно менять свой ответ, поскольку Пьер только что опубликовал это. Вам решать. 19.10.2015
  • Новые материалы

    5 простых концепций Python, ставших сложными
    #заранее извините 1) Переменные x = 4 y = 5 Переменная в Python — это символическое представление объекта. После присвоения некоторого объекта переменной Python мы приобретаем..

    «Освоение вероятности: изучение совместной, предельной, условной вероятности и теоремы Байеса —…
    Виды вероятности: Совместная вероятность Предельная вероятность Условная вероятность Диаграмма Венна в вероятностях: В “Set Theory” мы создаем диаграмму Венна...

    Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
    Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..

    Игра в прятки с данными
    Игра в прятки с данными Я хотел бы, чтобы вы сделали мне одолжение и ответили на следующие вопросы. Гуглить можно в любое время, здесь никто не забивается. Сколько регионов в Гане? А как..

    «Раскрытие математических рассуждений с помощью Microsoft MathPrompter и моделей больших языков»
    TL;DR: MathPrompter от Microsoft показывает, как использовать математические рассуждения с большими языковыми моделями; 4-этапный процесс для улучшения доверия и рассуждений в математических..