Удалите весь текст между двумя скобками
Предположим, что у меня есть такой текст,
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).