正则表达式匹配问题(使用R)

时间:2016-10-11 18:14:18

标签: r regex

我有一个带有产品名称的字符串向量,后跟6个数字,对应6个不同的数据列。

我希望能够提取产品名称或6个最终数字(然后可以拆分,因为它们总是用空格分隔)。最后的6个数字中间总是有一个点。

我测试了一个正则表达式(如下所示),它可以从字符串中连续提取6个数字,但是,当产品名称中还有一个数字时,它会失败(例如,下面的示例1名称中包含“£2.00” )。

我需要更改它,以便它可以在字符串的末尾开始搜索,因此只选择了最后6个数字。

当前正则表达式:

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

示例字符串:

  [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"

要提取的字符串(前两个示例):

[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"  

1 个答案:

答案 0 :(得分:1)

1)您似乎希望将输入字符向量s的最后6个字段粘贴在一起:

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")