web-dev-qa-db-ja.com

2つの角かっこで囲まれたすべてのテキストを削除します

このようなテキストがあるとしましょう。

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.")

[と]の間のすべてのテキスト(および角かっこ自体)を削除(編集:削除)したいと思います。これを行うための最良の方法は何ですか?正規表現とstingrパッケージを使用した私の微妙な試みは次のとおりです。

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

助けてくれてありがとう!

15

これとともに:

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

正規表現の意味:

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

次の方法でうまくいくはずです。 ?はレイジーマッチを強制します。これは、後続の.の前にできるだけ少ない]にマッチします。

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

否定された文字クラス/ブラケット式でPCRE正規表現を使用する必要はありません。「クラシック」TRE正規表現も機能します。

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

オンラインRデモ を参照してください

詳細

  • \\[-リテラル[(リテラル[[]として解析するには、エスケープするか、[のような角かっこ式内で使用する必要があります)
  • [^][]*-[および]以外の0+文字に一致する否定されたブラケット式(ブラケット式の先頭の]はリテラル]として扱われることに注意してください)
  • ]-リテラル](この文字はPCREとTREの両方の正規表現で特別ではなく、エスケープする必要はありません)。

角かっこのみを他の区切り文字で置き換える場合は、置換パターンで 後方参照 を使用してキャプチャグループを使用します。

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

別のデモ を参照してください

(...)括弧で囲まれた構造は、キャプチャグループを形成し、その内容には、後方参照\1を使用してアクセスできます(グループはパターンの最初のグループであるため、そのIDは1に設定されます)。

3

別のアプローチは次のとおりです。

library(qdap)
bracketX(text, "square")
3
Tyler Rinker

これは技術的にはあなたの質問に答えると思いますが、よりきれいなテキスト(コロンとスペースを削除)の正規表現の最後に\\:を追加することをお勧めします。

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..." 

reprexパッケージ (v0.2.0)によって2018-08-16に作成されました。

2
Nettle