Разделение строки с разделителями-запятыми и точками с запятой в R

Я пытаюсь разбить строку, содержащую две записи, и каждая запись имеет определенный формат:

  • Категория (например, active site/region), за которой следует :
  • Термин (например, His, Glu/nucleotide-binding motif A), за которым следует ,

Вот строка, которую я хочу разделить:

string <- "active site: His, Glu,region: nucleotide-binding motif A,"

Это то, что я пробовал до сих пор. За исключением двух пустых подстрок, он выдает желаемый результат.

unlist(str_extract_all(string, ".*?(?=,(?:\\w+|$))"))

[1] "active site: His, Glu"              ""                                   "region: nucleotide-binding motif A"
[4] "" 

Как избавиться от пустых подстрок?

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
3
0
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы получаете пустые строки, потому что .*? также может соответствовать пустой строке, где это утверждение (?=,(?:\\w+|$)) верно.

Вы можете исключить совпадение двоеточия или запятой, используя отрицательный класс символов перед сопоставлением :

[^:,\n]+:.*?(?=,(?:\w|$))

Объяснение

  • [^:,\n]+ Соответствует 1+ символам, кроме :, или новой строки
  • : Подберите двоеточие
  • .*? Подберите любой символ как можно меньше
  • (?= Положительный взгляд вперед, утверждает, что то, что находится прямо справа от текущей позиции:
    • , Совпадение буквально
    • (?:\w|$) Соответствует либо одному слову char, либо утверждает конец строки
  • ) Закрыть просмотр вперед

Демонстрация регулярных выражений | демонстрация R

string <- "active site: His, Glu,region: nucleotide-binding motif A,"
unlist(str_extract_all(string, "[^:,\\n]+:.*?(?=,(?:\\w|$))"))

Выход

[1] "active site: His, Glu"              "region: nucleotide-binding motif A"

Гораздо длиннее и не так элегантно, как @Четвертая птица +1, но это работает:

library(stringr)

string2 <- strsplit(string, "([^,]+,[^,]+),", perl = TRUE)[[1]][2]
string1 <- str_replace(string, string2, "")
string <- str_replace_all(c(string1, string2), '\\,$', '')
> string
[1] "active site: His, Glu"             
[2] "region: nucleotide-binding motif A"

Другие вопросы по теме