Удалить весь текст между двумя скобками

Предположим, у меня есть такой текст,

text<-c("[McCain]: We need tax policies that respect the wage earners and job creators. [Obama]: It's harder to save. It's harder to retire. [McCain]: The biggest problem with American healthcare system is that it costs too much. [Obama]: We will have a healthcare system, not a disease-care system. We have the chance to solve problems that we've been talking about... [Text on screen]: Senators McCain and Obama are talking about your healthcare and financial security. We need more than talk. [Obama]: ...year after year after year after year. [Announcer]: Call and make sure their talk turns into real solutions. AARP is responsible for the content of this advertising.")

и я хотел бы удалить (изменить: избавиться) весь текст между [ и ] (и сами скобки). Как лучше всего это сделать? Вот моя слабая попытка использовать regex и пакет stingr:

str_extract(text, "[[a-z]*]")

Спасибо за любую помощь!

5 ответов


С этого:

gsub("\[[^\]]*\]", "", subject, perl=TRUE);

что означает регулярное выражение:

  \[                       # '['
  [^\]]*                   # any character except: '\]' (0 or more
                           # times (matching the most amount possible))
  \]                       # ']'

следующее должно сделать трюк. The ? заставляет ленивый матч, который соответствует как мало . как можно раньше последующего ].

gsub('\[.*?\]', '', text)

вот еще один подход:

library(qdap)
bracketX(text, "square")

нет необходимости использовать регулярное выражение PCRE с отрицаемым выражением класса символов / скобки," классическое " регулярное выражение TRE тоже будет работать:

subject <- "Some [string] here and [there]"
gsub("\[[^]]*]", "", subject)
## => [1] "Some  here and "

посмотреть онлайн R demo

подробности:

  • \[ - литерал [ (должно быть экранировано или использовано внутри скобочного выражения, такого как [[] быть проанализированным как литерал [)
  • [^]]* - отрицаемое выражение скобки, которое соответствует 0 + символам других чем ] (заметьте, что тег ] в начале скобки выражение рассматривается как литерал ])
  • ] - литерал ] (этот символ не является особенным как в PCRE, так и в Tre regexps и не должен быть экранирован).

если вы хотите заменить квадратные скобки только некоторыми другими разделителями, используйте группу захвата с backreference в шаблоне замены:

gsub("\[([^]]*)\]", "{\1}", subject)
## => [1] "Some {string} here and {there}"

посмотреть другой демо

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


Я думаю, что это технически отвечает на то, что вы спросили, но вы, вероятно, хотите добавить \: до конца регулярного выражения для более красивого текста (удаление двоеточия и пробела).

library(stringr)
str_replace_all(text, "\[.+?\]", "")

#> [1] ": We need tax policies that respect the wage earners..."

и..

str_replace_all(text, "\[.+?\]\: ", "")
#> [1] "We need tax policies that respect the wage earners..." 

создано 2018-08-16 reprex пакет (версии v0.2.0).