Удалить шаблон, который встречается вне слов

Я пытаюсь удалить шаблон «ТАК» с конца вектора символов. Проблема, с которой я столкнулся с приведенным ниже кодом, заключается в том, что он удалит любую последовательность «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 и все последующее, включая пунктуацию во всей строке.

Любое руководство по этому поводу было бы очень признательно мне.

Вы хотите удалить строку "SO" или "SO # 12345"?

benson23 07.05.2022 04:48

Извините - ТАК и все после. Я просто хочу сохранить «Решения приветствуются, пожалуйста»

Dre Day 07.05.2022 05:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы можете использовать 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 и # и все еще идентифицируют и удаляют.

Dre Day 07.05.2022 05:21

@DreDay Мой предыдущий код может быть не слишком точным. Смотрите мое новое обновление :)

benson23 07.05.2022 05:39

Невероятно - спасибо! Я ссылаюсь на шпаргалку по регулярным выражениям, но мне очень трудно собрать ее по кусочкам самостоятельно. Как я думаю - теперь, если я хочу сделать 1-е вхождение или второе, что тогда? Этот пример опр. дает мне больше ясности на данный момент. Спасибо1

Dre Day 07.05.2022 06:18
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 

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