我有一个包含类似于以下内容的字符向量:
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
按预期行事?
答案 0 :(得分:6)
grep
用于查找模式。它返回与模式匹配的向量的索引。如果指定了value=TRUE
,则返回该值。从描述中,您似乎想要删除子字符串而不是返回初始向量的子集。
如果您需要删除子字符串,可以使用sub
sub('.*\\.', '', text)
#[1] "xYz" "ge" "qrstu"
作为第一个参数,我们匹配一个模式,即'.*\\.'
。它匹配一个或多个字符(.*
)后跟一个点(\\.
)。需要\\
来转义.
以将其视为该符号而不是任何字符。这将匹配到字符串中的最后一个.
字符。我们用''
替换匹配的模式作为替换参数,从而删除子字符串。
答案 1 :(得分:5)
grep
不做任何替换。它搜索匹配并返回给出匹配的索引(如果指定value = T,则返回值)。您得到的结果只是说那些符合您的标准在字符串中的某个点。如果你在文本向量中添加了一些不符合标准的东西(例如:“9”,“#$%23”,......)那么当你在它上面调用grep时它就不会返回那些。< / p>
如果您只想返回匹配的部分,则应该查看regmatches
函数。但是,出于您的目的,似乎sub
或gsub
应该按照您的意愿行事。
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