1

このような文字列があります。

x <- c("P2134.asfsafasfs","P0983.safdasfhdskjaf","8723.safhakjlfds") 

私はで終わる必要があります:

"2134", "0983", and "8723"

基本的に、各要素から数字である最初の 4 文字を抽出する必要があります。文字で始まるものもあります (単純な substring() 関数を使用できないようにするため)。

技術的には、次のようなことができると思います。

x <- gsub("^P","",x)
x <- substr(x,1,4)

しかし、正規表現でこれを行う方法を知りたいです!

4

4 に答える 4

4

パッケージのstr_matchを使用できます。stringr

library(stringr)
print(c(str_match(x, "\\d\\d\\d\\d")))
# [1] "2134" "0983" "8723"
于 2012-12-17T21:15:08.840 に答える
3

これも使えますgsub

> sub('.?([0-9]{4}).*', '\\1', x)
[1] "2134" "0983" "8723"
> 

私は、最初の一致だけを取得したことを保証する sub代わりに使用しました。任意の 1 文字とそのオプションを示します ( just に似ていますが、先頭に . がない場合は大文字と小文字が一致しません)。は、置換で参照するグループを意味します。のセットが複数ある場合は、それらも で参照できます。グループ内では、正しい構文がありました。数字だけが必要で、正確に4つ必要です。最後の部分は、任意のタイプの 0 個以上の後続文字を示しています。gsub.?.P()'\\1'()'\\2'

構文は機能していましたが、何かをそれ自体に置き換えていたため、同じ出力が得られました。

于 2012-12-17T21:18:25.907 に答える
1

これにより、文字列のどこに出現するかに関係なく、文字列の最初の 4 桁が取得されます。

mapply(function(x, m) paste0(x[m], collapse=""), 
        strsplit(x, ""),
        lapply(gregexpr("\\d", x), "[", 1:4))

それをバラバラに分解する:

上記の行で何が起こっているかは次のとおりです。

# this will get you a list of matches of digits, and their location in each x
matches <- gregexpr("\\d", x)

# this gets you each individual digit
matches <- lapply(matches, "[", 1:4)

# individual characters of x
splits <- strsplit(x, "")

# get the appropriate string
mapply(function(x, m) paste0(x[m], collapse=""), splits, matches)
于 2012-12-17T21:25:25.277 に答える