web-dev-qa-db-ja.com

正規表現の一致を抽出する

文字列から数値を抽出しようとしています。

そして、[0-9]+は文字列"aaa12xxx"および"12"

私はそれが次のようなものになるだろうと思った:

> grep("[0-9]+", "aaa12xxx", value=TRUE)
[1] "aaa12xxx"

そして、私は考え出した...

> sub("[0-9]+", "\\1", "aaa12xxx")
[1] "aaaxxx"

しかし、私は何らかの形の応答を得ました:

> sub("[0-9]+", "ARGH!", "aaa12xxx")
[1] "aaaARGH!xxx"

私は欠けている小さな詳細があります。

92
tovare

既存のすべての正規表現を一貫した構文で処理し、不足しているいくつかを追加する新しいストリンガーパッケージを使用します。

library(stringr)
str_locate("aaa12xxx", "[0-9]+")
#      start end
# [1,]     4   5
str_extract("aaa12xxx", "[0-9]+")
# [1] "12"
148
hadley

標準機能を無視してください」と言うのはおそらく少々面倒です-?gsub「関連項目」の具体的な参照さえも:

「regexpr」、「gregexpr」、「regexec」の結果に基づいて一致したサブストリングを抽出するための「regmatches」。

したがって、これは機能し、かなり簡単です。

txt <- "aaa12xxx"
regmatches(txt,regexpr("[0-9]+",txt))
#[1] "12"
72
thelatemail

多分

gsub("[^0-9]", "", "aaa12xxxx")
# [1] "12"
23
Marek

Perl正規表現のレイジーマッチングを使用できます。

> sub(".*?([0-9]+).*", "\\1", "aaa12xx99",Perl=TRUE)
[1] "12"

この場合、数字以外を置換しようとするとエラーになります。

正規表現でキャプチャ括弧を使用し、置換でグループ参照を使用します。括弧内のすべてが記憶されます。次に、最初のアイテムである\ 2によってアクセスされます。最初のバックスラッシュは、正規表現パーサーに渡されるように、Rのバックスラッシュの解釈をエスケープします。

gsub('([[:alpha:]]+)([0-9]+)([[:alpha:]]+)', '\\2', "aaa12xxx")
4
Ragy Isaac

1つの方法は次のとおりです。

test <- regexpr("[0-9]+","aaa12456xxx")

ここで、regexprが文字列の開始インデックスと終了インデックスを提供することに注意してください。

    > test
[1] 4
attr(,"match.length")
[1] 5

そのため、その情報をsubstr関数で使用できます

substr("aaa12456xxx",test,test+attr(test,"match.length")-1)

これを行うにはもっとエレガントな方法があると確信していますが、これは私が見つけることができる最速の方法でした。別の方法として、sub/gsubを使用して、残したくないものを取り除きます。

4
Robert

Gsubfnパッケージでstrapplyを使用します。 strapplyは、オブジェクトが文字列のベクトル(配列ではなく)であり、修飾子が(マージンではなく)正規表現であることを除いて、引数がオブジェクト、修飾子、および関数であるという点でapplyに似ています。

library(gsubfn)
x <- c("xy13", "ab 12 cd 34 xy")
strapply(x, "\\d+", as.numeric)
# list(13, c(12, 34))

これは、xの各コンポーネントの1つ以上の数字(\ d +)に一致し、各一致をas.numericに渡すことを意味します。コンポーネントがxの各コンポーネントの一致のベクトルであるリストを返します。出力を見ると、xの最初のコンポーネントには13の一致が1つあり、xの2番目のコンポーネントには12と34の2つの一致があります。 http://gsubfn.googlecode.com を参照してください。詳細については。

2
G. Grothendieck

別の解決策:

temp = regexpr('\\d', "aaa12xxx");
substr("aaa12xxx", temp[1], temp[1]+attr(temp,"match.length")[1])
1
pari

これらのアプローチの1つの重要な違いは、一致しない場合の動作です。たとえば、すべての位置で一致しない場合、regmatchesメソッドは入力と同じ長さの文字列を返さない場合があります

> txt <- c("aaa12xxx","xyz")

> regmatches(txt,regexpr("[0-9]+",txt)) # could cause problems

[1] "12"

> gsub("[^0-9]", "", txt)

[1] "12" ""  

> str_extract(txt, "[0-9]+")

[1] "12" NA  
0
andyyy