我有一个功能:
ncount <- function(num = NULL) {
toRead <- readLines("abc.txt")
n <- as.character(num)
x <- grep("{"n"} number",toRead,value=TRUE)
}
在grep-ing时,我希望函数中传递的num能够动态创建要搜索的模式吗?如何在R中完成?文本文件在每行中都有数字和文本
答案 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 demo和regex 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)
,当匹配项应包含空格字符或字符串的开始/结尾时 first two approaches in R的示例(替换为(?!\S)
和<<
所包含的匹配项):
>>