2016-06-18 74 views
-1

文字列があり、3つの数字と各数字の隣に3文字の最初のセットを抽出し、ベクトルに入れたいと思います。だから、この:文字列から数字と文字を抽出するR

t1 <- "The string contains numbers ranging from 3-4 cm and can reach up to 5.6 m long, and sometimes can even reach 10 m." 

t1はなる:

"3-4 cm", "5.6 m", "10m" 

私はgreplなどのgrep、のような様々な正規表現関数を見上げてきたが、私のクエリに一致する例を見つけることができません。 提案がありますか?

+0

人々が遊ぶために使用できるデータ(おもちゃの例)を提供できると便利です。 – milan

+0

提案: 'gregexpr'と' regmatches'または 'stringi'パッケージと' stri_extract_all'関数があります。 'gsub'も動作させることができます。 – Jota

答えて

0

あなたはこの正規表現[0-9.-]+\\s+[a-zA-z]{1,3}を試してみて、それらを抽出するためにstr_extract_allstringrからパッケージを使用することができます。

stringr::str_extract_all(t1, "[0-9.-]+\\s+[a-zA-Z]{1,3}") 
[[1]] 
[1] "3-4 cm" "5.6 m" "10 m" 
+0

迅速な対応と提案をありがとう。私は本当に役に立ちました。それは有り難いです。 – BHD

+0

お寄せいただきありがとうございます。しかし、このコードでは角カッコ内に埋め込まれているいくつかの数字が省略されていることに気付きました。たとえば、前の例では、次のように角括弧内に数字を追加したとします。 t1 < - "文字列の長さは3-4 cmまたは120(-150)cmで、長さは5.6 mです。時には10mに達することもあります。コードは{"3-4 cm" "5.6 m" "10 m"}を返しますが、 "120(-150)cm"は除外します 括弧内の数字と埋め込まれていない数字をさらに抽出する方法に関する提案括弧内の? – BHD

+0

'()'を文字クラスに追加するだけで問題ありません。 'stringr :: str_extract_all(t1、" [ - ()0-9。] + \\ s + [a-zA-Z] {1,3} ")'は動作するはずです – Psidom

1

はここで、これはgregexpr() + regmatches()で行うことができます方法は次のとおりです。

ipartRE <- '\\d+'; 
fpartRE <- '\\.\\d+'; 
numRE <- paste0(ipartRE,'(?:',fpartRE,')?'); 
rangeRE <- paste0(numRE,'(?:\\s*-\\s*',numRE,')?'); 
pat <- paste0(rangeRE,'\\s*[a-zA-Z]{1,3}\\b'); 
regmatches(t1,gregexpr(perl=T,pat,t1))[[1L]]; 
## [1] "3-4 cm" "5.6 m" "10 m" 

私が築き上げ人間の読みやすさのためにコンポーネント部分からのインクリメンタルな正規表現ですが、明らかにそうする必要はありません。


新しいパターンと一致させるには、番号を囲むカッコが一致する2番目の番号を変更する必要があります。また、私はない通常のASCII hyphen120(–150) cmでダッシュことがわかったが、en dashで、私はすべての3つの一般的なダッシュ種類(半角ダッシュASCII、およびem dash)と一致dashREと呼ばれる別の予め計算された正規表現の作品を追加:

ipartRE <- '\\d+'; 
fpartRE <- '\\.\\d+'; 
numRE <- paste0(ipartRE,'(?:',fpartRE,')?'); 
dashRE <- '[—–-]'; 
rangeOptParenRE <- paste0(numRE,'(?:\\s*(?:',dashRE,'\\s*',numRE,'|\\(\\s*',dashRE,'\\s*',numRE,'\\s*\\)\\s*))?'); 
pat <- paste0(rangeOptParenRE,'\\s*[a-zA-Z]{1,3}\\b'); 
regmatches(t1,gregexpr(perl=T,pat,t1))[[1L]]; 
## [1] "3-4 cm"  "120(–150) cm" "5.6 m"  "10 m" 
+1

提案していただきありがとうございます。それは有り難いです。 – BHD

+0

助けていただきありがとうございました。しかし、このコードでは角カッコ内に埋め込まれているいくつかの数字が省略されていることに気付きました。たとえば、前の例では、次のように角括弧内に数字を追加したとします。 t1 < - "文字列の高さは3-4 cmまたは120(-150)cmで、長さは5.6 mです時には10mに達することもあります」 コードは{"3-4 cm" "5.6 m" "10 m"}を返しますが、 "120(-150)cm"は除外します。 括弧内の数字をかっこ内に埋め込まれていないもの? – BHD

+0

@BHD編集を参照してください。 – bgoldst

関連する問題