Я пытаюсь удалить шаблон «ТАК» с конца вектора символов. Проблема, с которой я столкнулся с приведенным ниже кодом, заключается в том, что он удалит любую последовательность «SO» без учета регистра / просто удалит всю строку (по сравнению с последним обнаруженным шаблоном). Одно из решений, которое у меня было, состояло в том, чтобы выполнить некоторую ручную очистку и заставить все понизиться, за исключением последнего «SO», и оставить его чувствительным к регистру.
x <- data.frame(y = c("Solutions are welcomed, please SO # 12345")
x <- x %>% mutate(y = stri_replace_last_regex(x$y,"SO.*","",case_insensitive = TRUE)) # This will remove the string entirely - I'm not really sure why.
Желаемый результат:
'Solutions are welcomed, please'
Я использовал итерацию регулярного выражения, которая выглядит как \\b\\SO{2}\\b
и \\b\\D{2}*\\b|[[:punct:]]
- я полагаю, что ответ может лежать здесь, устанавливая границы слов, но я не уверен. Второй избавляется от SO, но я чувствую, что если в другом месте отдельно от формулировки есть такие буквы в последовательности, которые также будут удалены. Мне просто нужно удалить последнее вхождение SO и все последующее, включая пунктуацию во всей строке.
Любое руководство по этому поводу было бы очень признательно мне.
Извините - ТАК и все после. Я просто хочу сохранить «Решения приветствуются, пожалуйста»
Вы можете использовать gsub
, чтобы удалить шаблон, который вам не нужен.
gsub("\\sSO.+$", "", x$y)
[1] "Solutions are welcomed, please"
Используйте [[:upper:]]{2}
, если вы хотите обобщить любые две последовательные буквы верхнего регистра.
gsub("\\s[[:upper:]]{2}.+$", "", x$y)
[1] "Solutions are welcomed, please"
ОБНОВЛЕНИЕ: приведенный выше код может быть неточным, если в строке более одного «SO».
Чтобы продемонстрировать, я создал еще одну строку с несколькими «SO». Здесь мы захватываем любые символы с начала строки (^
) до последнего вхождения «SO» (SO.+$
). Эти строки хранятся в первой группе захвата (это регулярное выражение (.*)
). Затем мы можем использовать gsub
, чтобы заменить всю строку первой группой захвата (\\1
), таким образом избавившись от всего, что находится после последнего вхождения «SO».
x <- data.frame(y = "Solutions are SO welcomed, SO please SO # 12345")
gsub('^(.*)SO.+$', '\\1', x$y)
[1] "Solutions are SO welcomed, SO please "
Большое спасибо - верхний вроде подходит. Я тестировал, добавляя SO в конце любого слова перед последним SO, он удаляет только последний SO и все после него. Могу я спросить, что происходит с "\\sSO.+$"
? Благодарю вас! Я предполагаю, что это как-то определяет автономный SO? Некоторые из них представляют собой SO# без пробела между SO и # и все еще идентифицируют и удаляют.
@DreDay Мой предыдущий код может быть не слишком точным. Смотрите мое новое обновление :)
Невероятно - спасибо! Я ссылаюсь на шпаргалку по регулярным выражениям, но мне очень трудно собрать ее по кусочкам самостоятельно. Как я думаю - теперь, если я хочу сделать 1-е вхождение или второе, что тогда? Этот пример опр. дает мне больше ясности на данный момент. Спасибо1
library(dplyr)
library(stringr)
x %>%
mutate(y = str_replace_all(y, 'SO.*', ''))
или
library(dplyr)
library(stringr)
x %>%
mutate(y = str_replace_all(y, 'SO\\s\\#\\s\\d*', ''))
выход:
y
1 Solutions are welcomed, please
Вы хотите удалить строку "SO" или "SO # 12345"?