如果字符串包含特定数字,则抓取

时间:2014-02-21 07:48:48

标签: regex r pattern-matching matching string-matching

我有一个如下所示的数据集 -

> a_i
 [1] "Our-Facebook-Page/td-p/3175990"                           
 [2] "Our-Facebook-Page/td-p/3175990/page/2"  
   ....    
[17] "Data-duplicate-files/td-p/4743405"                  
[18] "Data-duplicate-files/td-p/4743405/page/2"            
[19] "Subscription-Release-1-sucks/td-p/4556739"       
[20] "Subscription-Release-1-sucks/td-p/4556739/page/2"

 > b_i
[1] "Data-duplicate-files/td-p/4743405"                  
[2] "Subscription-Release-1-sucks/td-p/4556739"
[3] "Quick-fix/td-p/4556740"

我的目标是找到仅存在于b_i中的7位数字(例如4743405,4556739,4556740),并从a_i中获取包含相应数字的数据。所以最终输出将是这样的 -

[1] "Data-duplicate-files/td-p/4743405"                  
[2] "Data-duplicate-files/td-p/4743405/page/2"            
[3] "Subscription-Release-1-sucks/td-p/4556739"       
[4] "Subscription-Release-1-sucks/td-p/4556739/page/2""

我可以使用strsplit(b_i,“/”)获取数字但我仍然在抓取包含匹配数字的列表。是否有任何优雅的方式来映射这些数字并获取列表?

2 个答案:

答案 0 :(得分:5)

a_i[grep( paste( gsub("(^.+/)([[:digit:]])(/.+$)", "\\2", b_i), 
                 collapse="|"), 
     a_i)]
[1] "Data-duplicate-files/td-p/4743405"               
[2] "Data-duplicate-files/td-p/4743405/page/2"        
[3] "Subscription-Release-1-sucks/td-p/4556739"       
[4] "Subscription-Release-1-sucks/td-p/4556739/page/2"

这构造了一串由管道符号分隔的数字字符串,形成一个greppish-OR模式。如果你想强制执行7位数规则,你可以放置一个{}重复量词。目前它会接受正斜杠之间的任意数字位数。

答案 1 :(得分:3)

您的数据格式不是可重复的,所以我没有尝试过,但只需要执行一个7位规则来识别数字,它与IShouldBUyABoat略有不同:

sapply(regmatches(b_i,regexpr("[[:digit:]]{7}", b_i)),
       function(x) a_i[grepl(x, a_i)])