使用变量在R中创建正则表达式模式

时间:2013-01-30 12:44:08

标签: regex r pattern-matching

我有一个功能:

ncount <- function(num = NULL) {

 toRead <- readLines("abc.txt")
 n <- as.character(num)
 x <- grep("{"n"} number",toRead,value=TRUE)

}

在grep-ing时,我希望函数中传递的num能够动态创建要搜索的模式吗?如何在R中完成?文本文件在每行中都有数字和文本

2 个答案:

答案 0 :(得分:4)

您可以使用paste来连接字符串:

grep(paste("{", n, "} number", sep = ""),homicides,value=TRUE)

答案 1 :(得分:0)

为了从R中的变量构建正则表达式,在当前方案中,您可以简单地使用 paste0 将字符串文字与变量进行连接

grep(paste0('\\{', n, '} number'), homicides, value=TRUE)

请注意,{是括号[...]之外的特殊字符(也称为 character class ),如果需要查找文字{{ 1}}字符。

如果您使用项目列表作为替代列表,则可以使用{strong> { / paste 的组合:

paste0

生成的words <- c('bananas', 'mangoes', 'plums') regex <- paste0('Ben likes (', paste(words, collapse='|'), ')\\.') 正则表达式将匹配Ben likes (bananas|mangoes|plums)\.Ben likes bananas.Ben likes mangoes.。请参见R demoregex demo

注意:PCRE(当您将Ben likes plums.传递给基本R regex函数时)或ICU( stringr / stringi regex函数) )已被证明可以更好地处理这些情况,建议您使用这些引擎,而不要使用基本R regex函数中使用的默认TRE regex库。

通常,您会希望构建一个模式,该模式包含应完全匹配的单词列表(作为整个单词)。在这里,很大程度上取决于边界的类型以及单词是否可以包含特殊的正则表达式元字符,它们是否可以包含空格。

在最一般的情况下,word boundaries (\b)运行良好。

perl=TRUE

regex <- paste0('\\b(', paste(words, collapse='|'), ')\\b') unlist(regmatches(examples, gregexpr(regex, examples, perl=TRUE))) ## => [1] "bananas" "mangoes" "plums" 模式将与\b(bananas|mangoes|plums)\b匹配,但与won't match bananas(请参阅R demo)匹配。

如果您的列表是

banana

您必须先转义这些单词,即在每个元字符之前附加words <- c('cm+km', 'uname\\vname')

\

如果您的单词可以以特殊的正则表达式元字符开头或结尾,则regex.escape <- function(string) { gsub("([][{}()+*^$|\\\\?.])", "\\\\\\1", string) } examples <- c('Text: cm+km, and some uname\\vname?') words <- c('cm+km', 'uname\\vname') regex <- paste0('\\b(', paste(regex.escape(words), collapse='|'), ')\\b') cat( unlist(regmatches(examples, gregexpr(regex, examples, perl=TRUE))) ) ## => cm+km uname\vname 单词边界将不起作用。使用

  • 明确的单词边界\b / (?<!\w),当非单词字符或字符串的开始/结尾之间期望匹配时
  • 空格边界(?!\w) / (?<!\S),当匹配项应包含空格字符或字符串的开始/结尾时
  • 使用lookbehind/lookahead组合和自定义字符类/方括号表达式,甚至更复杂的模式来构建自己的内容。

first two approaches in R的示例(替换为(?!\S)<<所包含的匹配项):

>>