防止R中的grep治疗"。"作为一封信

时间:2015-07-31 13:37:29

标签: regex r grep character

我有一个包含类似于以下内容的字符向量:

text <- c("ABc.def.xYz", "ge", "lmo.qrstu")

我想删除.之前的所有内容:

> "xYz" "ge" "qrstu"

但是,grep函数似乎将.视为一封信:

pattern <- "([A-Z]|[a-z])+$"

grep(pattern, text, value = T)

> "ABc.def.xYz" "ge"          "lmo.qrstu" 

该模式适用于其他地方,例如regexpal

如何让grep按预期行事?

4 个答案:

答案 0 :(得分:6)

grep用于查找模式。它返回与模式匹配的向量的索引。如果指定了value=TRUE,则返回该值。从描述中,您似乎想要删除子字符串而不是返回初始向量的子集。

如果您需要删除子字符串,可以使用sub

 sub('.*\\.', '', text)
 #[1] "xYz"   "ge"    "qrstu"

作为第一个参数,我们匹配一个模式,即'.*\\.'。它匹配一个或多个字符(.*)后跟一个点(\\.)。需要\\来转义.以将其视为该符号而不是任何字符。这将匹配到字符串中的最后一个.字符。我们用''替换匹配的模式作为替换参数,从而删除子字符串。

答案 1 :(得分:5)

grep不做任何替换。它搜索匹配并返回给出匹配的索引(如果指定value = T,则返回值)。您得到的结果只是说那些符合您的标准在字符串中的某个点。如果你在文本向量中添加了一些不符合标准的东西(例如:“9”,“#$%23”,......)那么当你在它上面调用grep时它就不会返回那些。< / p>

如果您只想返回匹配的部分,则应该查看regmatches函数。但是,出于您的目的,似乎subgsub应该按照您的意愿行事。

gsub(".*\\.", "", text)

我建议您阅读正则表达式?regex的帮助页面。维基百科页面也是一个不错的阅读,但请注意R的正则表达式与其他一些有点不同。 https://en.wikipedia.org/wiki/Regular_expression

答案 2 :(得分:4)

您可以在str_extract包中尝试stringr功能。

str_extract(text, "[^.]*$")

这将匹配最后存在的所有非点字符。

答案 3 :(得分:2)

你的模式确实有效,问题在于grep做了与你的想法不同的事情。

让我们首先使用来自包str_extract_all的{​​{1}}的模式。

stringr

请注意,结果符合您的预期!

您遇到的问题是library(stringr) str_extract_all(text, pattern ="([A-Z]|[a-z])+$") [[1]] [1] "xYz" [[2]] [1] "ge" [[3]] [1] "qrstu" 将为您提供与正则表达式匹配的完整元素,而不仅仅是元素的匹配部分。例如,在下面的示例中,grep将返回第一个元素,因为它匹配“a”:

grep