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

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

text<-c("[McCain]: We need tax policies that respect the wage earners and job creators. [Obama]: It harder to save. It 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.")

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

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

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

Ответ 1

При этом:

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Смотрите онлайн-демонстрацию R

Подробнее

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

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

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

Смотрите еще одно демо

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