10

重複の可能性:
R(正規表現)のすべての括弧内の情報を抽出します

私は文字列を持っています

df

Peoplesoft(id-1290)

たとえば、括弧の間にある文字をキャプチャするのが好きです。上記の例からid-1290を取得するのが好きです。

私はこれを使用しました:

x <- regexpr("\\((.*)\\)", df) 

これは私に次のような数字を与えています

[1] 10

Rで正規表現を使用して括弧の間にテキストを取得する簡単な方法はありますか?

4

2 に答える 2

33

私はこれに使用することを好みますgsub()

gsub(".*\\((.*)\\).*", "\\1", df)
[1] "id-1290"

正規表現は次のように機能します。

  • 括弧内のテキストを検索します-実際の括弧ではなく、私の余分な括弧のセット、つまり(.*)
  • これを後方参照として返します。\\1

つまり、文字列内のすべてのテキストを後方参照に置き換えます


regexpではなくを使用する場合はgsub、次のようにします。

x <- regexpr("\\((.*)\\)", df)
x

[1] 11
attr(,"match.length")
[1] 9
attr(,"useBytes")
[1] TRUE

これは11の値、つまり見つかった式の開始位置を返します。match.lengthまた、一致した文字数を示す属性に注意してください。

これは次のように抽出できますattr

attr(x, "match.length")
[1] 9

次に、を使用substringして文字を抽出します。

substring(df, x+1, x+attr(x, "match.length")-2)
[1] "id-1290"
于 2012-11-21T17:36:41.203 に答える
5

後読み/先読みを使用した、少し異なる方法を次に示します。

df <- "Peoplesoft(id-1290)"
regmatches(df,gregexpr("(?<=\\().*?(?=\\))", df, perl=TRUE))

アンドリーの答えとの違いは、これは括弧内の複数の文字列を抽出するためにも機能するということです。例えば:

df <- "Peoplesoft(id-1290) blabla (foo)"
regmatches(df,gregexpr("(?<=\\().*?(?=\\))", df, perl=TRUE))

与える:

[[1]]
[1] "id-1290" "foo" 
于 2012-11-21T18:19:26.403 に答える