php preg_match_all等价物

时间:2014-06-25 21:05:38

标签: regex r matrix

我正在寻找一个等同于PHP preg_match_all函数的R。

目的:

  • 搜索单个字符串(不是多个字符串的向量)以获取正则表达式
  • 返回匹配矩阵

示例:

假设以下扁平字符串没有分隔符。

  
    

"这是一个类似段落的示例字符串。在该字符串中存在两组信息。每组包含两个变量。我们想要提取这些集合中的集合和变量。每个信息集的格式都相同。第一集是Title:Sir;姓氏:约翰;第二集是Title:Mr。;姓氏:史密斯。"

  

使用类似于

的正则表达式模式
"Title: ([^;]*?); Last Name: ([^;.]*?)"

我想从上面的字符串中生成以下矩阵:

[  ][,1]  [,2]
[1,] Sir  John
[2,] Mr.  Smith

我已使用preg_match_all函数在远程服务器上用PHP成功完成了此操作;但是,我访问的文本文件相对较大(不是很大但反正上传速度很慢)。在R中构建这将节省大量时间。

我已经阅读了在R中使用grep等的内容,但是我发现每个例子都在向量中搜索模式,而我无法生成如上所述的矩阵。

我也玩过stringr套餐,但我还没有成功生成矩阵。

这对我来说似乎是一项常见的任务,所以我确信比我聪明的人之前找到了解决方案。

3 个答案:

答案 0 :(得分:4)

使用regmatches考虑以下选项:

x <- 'This is a sample string written like a paragraph. In this string two sets of information exist. Each set contains two variables. We want to extract the sets and variables within those sets. Each information set is formatted the same way. The first set is Title: Sir; Last Name: John; and the second set is Title: Mr.; Last Name: Smith.'
m <- regmatches(x, gregexpr('(?i)Title: \\K[^;]+|Last Name: \\K[^;.]+', x, perl=T))
matrix(unlist(m), ncol=2, byrow=T)

<强>输出

     [,1]  [,2]   
[1,] "Sir" "John" 
[2,] "Mr." "Smith"

答案 1 :(得分:2)

由于某些原因,似乎没有一种简单的方法可以在基础中提取捕获的匹配(我希望regmatches也可以使用捕获的组,但它没有)。我最后写了自己的文章,你可以在regcapturedmatches.R找到它。它将与

一起使用
  

a&lt; - “第一集是Title:Sir和姓:John;第二集是Title:Mr.和姓:Smith。”

m<-gregexpr("Title: ([^;]*) and Last Name: ([^;.]*)", a, perl=T, ignore.case=T)
regcapturedmatches(a,m)[[1]]

这将返回

     [,1]  [,2]   
[1,] "Sir" "John" 
[2,] "Mr." "Smith"

(我添加了[[1]],因为你说你一次只能对一个字符串进行操作。该函数可以对一个向量进行操作并将结果返回一个列表。真的,在R中,每个东西都是一个vector所以没有“单个”字符串这样的东西,你只需要一个长度为1的字符串向量。)

当然这种方法与正则表达式一样好。我必须稍微修改您的示例数据,以便您的表达式匹配多个标题/名称。

答案 2 :(得分:2)

这是stringr版本:

library(stringr)
str_match_all(x, pattern)

产地:

[[1]]
     [,1]                              [,2]  [,3]   
[1,] "Title: Sir and Last Name: John"  "Sir" "John" 
[2,] "Title: Mr. and Last Name: Smith" "Mr." "Smith"

请注意,我必须编辑您的文本,以便第二个也是“和姓氏:”形式。要获得矩阵,您可以这样做:

result[[1]][[-1]]  # assumes the above is in `result`

这方面的一个限制是使用regexec,它不支持perl正则表达式。