使用R

时间:2018-02-21 21:54:59

标签: r regex dplyr

我有一个过滤问题,我试图根据字符串的存在选择4种不同模式中的任何一种:

  1. 一串10个连续数字(例如1250126681)
  2. 一串13个连续数字(例如9781626724266)
  3. 以" id&#34开头的字符串;然后是9个连续数字(例如id975448501)
  4. 大写字母和数字组合的字符串(长度= 10)(例如B004TLHNOC)
  5. 这是一个样本数据集:

    FromName<-c("PubA","PubB","PubC","PubB","PubC","PubB")
    PostName<-c("https://www.amazon.com/gp/product/1250126681/ref=as_li_tl","https://www.amazon.com/dp/B004TLHNOC/ref=sr_1_1","https://us.macmillan.com/books/9781626724266",
                "https://itunes.apple.com/us/book/six-of-crows/id975448501","http://www.anrdoezrs.net/links/7992675/type/dlg/sid/MAChhjan32018eman/https://www.barnesandnoble.com/w/something-to-howl-about-christine-warren/1127202692","https://www.amazon.com/Beach-House-Cookbook-Mary-Andrews-ebook/dp/B01M2UZS7F/")
    df<-cbind(FromName,PostName)
    

    输出应如下所示:

    enter image description here

    我认为前两种模式的正则表达式是:^ [0-9] {10} $和^ [0-9] {13} $,我认为[az] {2} \ d {9}应该用于选择第三种模式的观察,但我仍然坚持模式#4。我也不确定如何将多个正则表达式模式组合成一个dplyr过滤器函数。

2 个答案:

答案 0 :(得分:2)

以下正则表达式应该有效:

[0-9]{10}
[0-9]{13}
id[0-9]{9}
[A-Z0-9]{10}

您不应该需要^$,因为您正在尝试匹配字符串中的内容。 ^abc$abc匹配,但不匹配xabcx

第二种模式将返回第四种模式的子集。任何10位数的字符串也是10位数字或大写字母的字符串。因此,您只需要三种模式来匹配这四种类别。除非你想以某种方式区分10个字符的ONLY整数字符串与整数和字符的字符串,但看起来并非如此。

您可以使用|检查多种模式。但是,这将返回第一场比赛。例如。 str_extract('abcdef','abc|def')仅返回abc。如果您知道每个URL与任何类别的匹配不超过1个,那就这样做。

我喜欢使用str_extract中的stringr

ProductID = str_extract(PostName, 'id[0-9]{9}|[0-9]{13}|[A-Z0-9]{10}')

答案 1 :(得分:0)

由于您上面的数据是一个矩阵,我们可以将结果包含在下面:

您可以使用basename

cbind(df[,1],basename(sub("ref.*","",df[,2])))
     [,1]   [,2]           
[1,] "PubA" "1250126681"   
[2,] "PubB" "B004TLHNOC"   
[3,] "PubC" "9781626724266"
[4,] "PubB" "id975448501"  
[5,] "PubC" "1127202692"   
[6,] "PubB" "B01M2UZS7F"  

或者你可以这样做:

cbind(df[,1],sub(".*\\/(\\w+)\\/(?>ref.*)|.*\\/(\\w+)\\S{1,2}$","\\1\\2",df[,2],perl = T))
     [,1]   [,2]          
[1,] "PubA" "1250126681"  
[2,] "PubB" "B004TLHNOC"  
[3,] "PubC" "978162672426"
[4,] "PubB" "id97544850"  
[5,] "PubC" "112720269"   
[6,] "PubB" "B01M2UZS7F"  
相关问题