2016-10-11 6 views
0

6つの異なるデータ列に対応する6つの数字の後に、製品名の文字列ベクトルがあります。正規表現マッチング問題(Rを使用)

製品名または6つの最終的な番号を抽出できるようにしたい(空白で区切られているので分割することができます)。最後の6つの数字は、常に中央に点を持っています。

私は文字列から6つの数字を連続して抽出できる正規表現をテストしましたが、製品名に数値が含まれていると失敗します(例1の例では、名)。

これは、最後の6つの数字だけが選択されるように、文字列の最後で検索を開始できるように変更する必要があります。

現在の正規表現:

([\d]+[.][\d]+[\s]?){6} 

例文字列:(最初の2つの例)を抽出する

[1] "white coffee tall £2.00 6.00 6.00 6.00 0.00 1.00 5.00"       
    [2] "product group:0 Total 6.00 6.00 6.00 0.00 1.00 5.00"      
    [3] "£1.45 CAKE 12.00 17.40 17.40 0.00 2.90 14.50"        
    [4] "95P CAKE £5.00 32.00 30.40 30.40 0.00 5.07 25.33"        
    [5] "Complementary hot beverage 11.00 0.00 0.00 0.00 0.00 0.00"     
    [6] "Flat white Large 5.00 5.00 5.00 0.00 0.83 4.17"       
    [7] "Flat white Small 8.00 5.20 5.20 0.00 0.87 4.33"       
    [8] "Go ahead Bar 5.00 4.25 4.25 0.00 0.71 3.54"        
    [9] "Graze Box 2.00 3.20 3.20 0.00 0.00 3.20"         
[10] "Joe & Seph popcorn 2.00 1.90 1.90 0.00 0.32 1.58"       
[11] "Kit kat 4 finger 6.00 3.00 3.00 0.00 0.50 2.50" 

がString:

[1] "6.00 6.00 6.00 0.00 1.00 5.00" 
[2] "6.00 6.00 6.00 0.00 1.00 5.00" 
+0

'サブ(」試し*((:。?[。] \\ bは\\ D + 1 \\ D + \\最後の '。*'はそれほど重要ではなく、 '$'で置き換えることができます)。 https://regex101.com/r/PXmGu1/1を参照してください –

+0

ありがとうございます、私は正規表現のテスターで何をしているのかについて頭を浮かべます。 – user3084100

答えて

1

1)それはあなたがしたいようです入力文字ベクトルの最後の6フィールドsは、一緒に貼り付け:

sapply(strsplit(s, " "), function(x) paste(tail(x, 6), collapse = " ")) 

2)はまた、問題の正規表現に若干の微調整が機能することに注意してください。

sub(".*(([\\d]+[.][\\d]+[\\s]?){6})$", "\\1", s, perl = TRUE) 

注:再現可能な形で入力sである:

s <- c("white coffee tall £2.00 6.00 6.00 6.00 0.00 1.00 5.00", 
"product group:0 Total 6.00 6.00 6.00 0.00 1.00 5.00",     
"£1.45 CAKE 12.00 17.40 17.40 0.00 2.90 14.50",        
"95P CAKE £5.00 32.00 30.40 30.40 0.00 5.07 25.33",        
"Complementary hot beverage 11.00 0.00 0.00 0.00 0.00 0.00", 
"Flat white Large 5.00 5.00 5.00 0.00 0.83 4.17",     
"Flat white Small 8.00 5.20 5.20 0.00 0.87 4.33",       
"Go ahead Bar 5.00 4.25 4.25 0.00 0.71 3.54",       
"Graze Box 2.00 3.20 3.20 0.00 0.00 3.20",        
"Joe & Seph popcorn 2.00 1.90 1.90 0.00 0.32 1.58", 
"Kit kat 4 finger 6.00 3.00 3.00 0.00 0.50 2.50") 
+0

ああ、これはもっと簡単な解決策になるだろう!なぜ私はこれについて考えていないのか分かりませんが、現時点では正規表現の方が良いのかどうかはわかりませんが、確かにわかりやすいです。 – user3084100

+0

角括弧の中から短い文字クラスを取り除く場合は、 'perl = TRUE'を使う必要はありません。 –

+0

私は質問の正規表現に最小限の変更を加えたいが、良い点だ。 –