防止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"