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