防止R中的grep治疗&引用;作为一封信
我有一个字符向量,其中包含类似于以下内容的文本:防止R中的grep治疗&引用;作为一封信,r,regex,R,Regex,我有一个字符向量,其中包含类似于以下内容的文本: text <- c("ABc.def.xYz", "ge", "lmo.qrstu") 但是,grep函数似乎将视为一个字母: pattern <- "([A-Z]|[a-z])+$" grep(pattern, text, value = T) > "ABc.def.xYz" "ge" "lmo.qrstu" 模式“ABc.def.xYz”“ge”“lmo.qrstu” 该模式在其他地方有效,例如
text <- c("ABc.def.xYz", "ge", "lmo.qrstu")
但是,grep
函数似乎将
视为一个字母:
pattern <- "([A-Z]|[a-z])+$"
grep(pattern, text, value = T)
> "ABc.def.xYz" "ge" "lmo.qrstu"
模式“ABc.def.xYz”“ge”“lmo.qrstu”
该模式在其他地方有效,例如在
如何才能使
grep
按预期的方式运行?grep
用于查找模式。它返回与模式匹配的向量的索引。如果指定了,value=TRUE
,则返回值。从描述中可以看出,您似乎希望删除子字符串,而不是返回初始向量的子集
如果需要删除子字符串,可以使用sub
sub('.*\\.', '', text)
#[1] "xYz" "ge" "qrstu"
作为第一个参数,我们匹配一个模式,即
'.\\\.
。它匹配一个或多个字符(*
),后跟一个点(\.
)。需要使用\\
对
进行转义,以将其视为该符号而不是任何字符。这将一直匹配到字符串中的最后一个
字符。我们用一个'
作为替换参数替换匹配的模式,从而删除子字符串。grep
不进行任何替换。它搜索匹配项并返回给出匹配项的索引(如果指定value=T,则返回值)。你得到的结果只是说这些在字符串中的某个点符合你的标准。如果您在文本向量的任何位置添加了不符合条件的内容(例如:“9”、“#$%23”和…),那么当您调用grep时,它不会返回这些内容
如果您希望它只返回匹配的部分,您应该查看regmatches
函数。然而,出于您的目的,sub
或gsub
似乎应该做您想做的事情
gsub(".*\\.", "", text)
我建议阅读regexs
?regex
的帮助页面。wikipedia页面也是一个不错的读物,但请注意R的正则表达式与其他一些有点不同 您可以尝试从stringr
软件包中提取stru
函数
str_extract(text, "[^.]*$")
这将匹配最后存在的所有非点字符。您的模式确实有效,问题是
grep
做的事情与您认为的不同
首先,让我们将您的模式与包stringr
中的str\u extract\u all
一起使用
library(stringr)
str_extract_all(text, pattern ="([A-Z]|[a-z])+$")
[[1]]
[1] "xYz"
[[2]]
[1] "ge"
[[3]]
[1] "qrstu"
请注意,结果与您预期的一样
您遇到的问题是,grep
将为您提供与正则表达式匹配的完整元素,而不仅仅是元素的匹配部分。例如,在下面的示例中,grep将返回第一个元素,因为它与“a”匹配:
是的,这个很好用。你能解释一下
*\.
语法吗?我想知道这个问题还会有多少答案。看起来像是一个史诗般的骗局。@DavidArenburg,但有这么多的软件包来回答这个问题!特别是因为在r底是不可能的!我的问题不是“如何在R中使用正则表达式”,而是“为什么R中的grep会做这个特殊的事情”,所以我不会说它是重复的。关于最后一部分regmatches(x,gregexpr(pattern=“a”,x))
或使用regexpr
library(stringr)
str_extract_all(text, pattern ="([A-Z]|[a-z])+$")
[[1]]
[1] "xYz"
[[2]]
[1] "ge"
[[3]]
[1] "qrstu"
grep(pattern = "a", x = c("abcdef", "bcdf"), value = TRUE)
[1] "abcdef"