Используйте stringr в R, чтобы найти оставшуюся строку после последней подстроки - PullRequest
0 голосов
/ 05 мая 2018

Как я могу использовать str_match, чтобы извлечь оставшуюся строку после последней подстроки.

Например, для строки «яблоки и апельсины и бананы со сливками» я хотел бы извлечь остаток этой строки после последнего появления «и» для возврата «бананов и сливок».

Я перепробовал много альтернатив этой команде, но она либо возвращает остаток строки после первых «и», либо пустую строку.

library(stringr)

str_match("apples and oranges and bananas with cream", "(?<= and ).*(?! and )")

    #     [,1]                             
    #[1,] "oranges and bananas with cream"

Я искал в StackOverflow решения и нашел некоторые для javascript, Python и base R, но не нашел ни одного для пакета stringr.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Если нам нужно str_match

library(stringr)
str_match("apples and oranges and bananas with cream",   ".*\\band\\s(.*)")[,2]
#[1] "bananas with cream"

Или есть stri_match_last от stringi

library(stringi)
stri_match("apples and oranges and bananas with cream", 
         regex = ".*\\band\\s(.*)")[,2]
#[1] "bananas with cream"
0 голосов
/ 05 мая 2018

Другой простой подход - использовать вариант схемы * SKIP, которого следует избегать , с использованием групп захвата, т. Е. What_I_want_to_avoid|(What_I_want_to_match):

library(stringr)
s  <- "apples and oranges and bananas with cream"
str_match(s, "^.+and (.*)")[,2]

Ключевой идеей здесь является полное игнорирование общих совпадений, возвращаемых механизмом регулярных выражений: это мусорное ведро. Вместо этого нам нужно только проверить группу захвата от 1 до [,2], которая, когда установлена, содержит то, что мы ищем. Смотрите также: http://www.rexegg.com/regex-best-trick.html#pseudoregex

Мы можем сделать то же самое, используя базовые R gsub -функции, например,

gsub("^.+and (.*)", "\\1", s, perl = TRUE)

PS: К сожалению, мы не можем использовать шаблон What_I_want_to_avoid(*SKIP)(*FAIL)|What_I_want_to_match с функциями stringi / stringr, так как на нее ссылается библиотека регулярных выражений ICU , которая не включает глаголы (*SKIP)(*FAIL) (они доступны только в PCRE).

0 голосов
/ 05 мая 2018

(Не знаю насчет str_match. Регулярного выражения Base R должно быть достаточно.) Поскольку сопоставление с образцом регулярного выражения является "жадным", то есть оно будет искать все совпадения и выбирать последнее, просто:

sub("^.+and ", "", "apples and oranges and bananas with cream")
#[1] "bananas with cream"

Я почти уверен, что в "смазанном" углу гадлейверса будет эквивалент.

Тогда ошибка с:

 library(lubridate)

Attaching package: ‘lubridate’

The following object is masked from ‘package:plyr’:

    here

The following objects are masked from ‘package:data.table’:

    hour, isoweek, mday, minute, month, quarter, second, wday, week, yday, year

The following object is masked from ‘package:base’:

    date

> str_replace("apples and oranges and bananas with cream", "^.+and ", "")
Error in str_replace("apples and oranges and bananas with cream", "^.+and ",  : 
  could not find function "str_replace"

Так что это не в pkg:lubridate, а скорее в stringr (который, как я понимаю, очень легкая оболочка для пакета stringi):

library(stringr)
 str_replace("apples and oranges and bananas with cream", "^.+and ", "")
[1] "bananas with cream"

Мне бы очень хотелось, чтобы люди, которые задают вопросы о функциях неосновного пакета, включали бы library звонок, чтобы дать респондентам подсказку относительно их рабочего окружения.

...