使用正则表达式从字符串的数据帧中提取子表达式

时间:2017-07-26 14:55:02

标签: r regex stringr

我有一个能够使用grepl匹配我的数据的正则表达式,但我无法弄清楚如何将其中的子表达式提取到新列。

这会将测试字符串返回为foo,而不包含任何子表达式:

entryPattern <- "(\\d+)\\s+([[:lower:][:blank:]-]*[A-Z][[:alpha:][:blank:]-]+[A-Z]\\s[[:alpha:][:blank:]]+)\\s+([A-Z]{3})\\s+(\\d{4})\\s+(\\d\\d\\-\\d\\d)\\s+([[:print:][:blank:]]+)\\s+(\\d*\\:?\\d+\\.\\d+)"
test <- "101      POULET Laure                               FRA     1992   25-29     E. M. S. Bron Natation          26.00"
m <- regexpr(entryPattern, test)
foo <- regmatches(test, m)

在我的实际用例中,我使用了与test类似的许多字符串。我能够找到格式正确的,所以我认为模式是正确的。

rows$isMatch <- grepl(entryPattern, rows$text)

我们希望做的是将子表达式添加为行数据框中的新列(即rows$rankrows$namerows$country等)。 提前感谢任何建议。

1 个答案:

答案 0 :(得分:0)

似乎regmatches不会做我想要的。相反,我需要@ kent-johnson的suggested字符串包。

library(stringr)
test <- "101      POULET Laure                               FRA     1992   25-29     E. M. S. Bron Natation          26.00"
entryPattern <- "(\\d+)\\s+([[:lower:][:blank:]-]*[A-Z][[:alpha:][:blank:]-]+[A-Z]\\s[[:alpha:][:blank:]]+?)\\s+([A-Z]{3})\\s+(\\d{4})\\s+(\\d\\d\\-\\d\\d)\\s+([[:print:][:blank:]]+?)\\s+(\\d*\\:?\\d+\\.\\d+)"
str_match(test, entryPattern)[1,2:8]

哪个输出:

[1] "101"                            
[2] "POULET Laure"                   
[3] "FRA"                            
[4] "1992"                           
[5] "25-29"                          
[6] "E. M. S. Bron Natation"
[7] "26.00"