我有一堆汽车模型字符串:
vec <- c("2010 mercedes-benz sl500r",
"2010 mercedes-benz e550",
"2010 mercedes-benz glk350",
"2010 mercedes-benz c300w",
"2010 mercedes-benz 300")
我想删除模型名前n个字母之后的所有内容所以这是想要的输出:
c("2010 mercedes-benz sl",
"2020 mercedes-benz e",
"2017 mercedes-benz glk",
"2013 mercedes-benz c",
"2014 mercedes-benz 300")
问题是,即使制造商是相同的,mercedes-benz
,模型名称并不总是具有相同的结构。这意味着它们可以以0到3个字母开头,也可以以字母结尾或不结尾。我想去掉字母后面的所有内容,如果有的话。
我试过:
gsub("(?<=benz\s\D)\w*", "", vec, perl=T)
但是它不处理多字母模型和这个:
gsub("(?<=benz\s\D*)\w*", "", vec, perl=T)
在正则表达式中不合适,原因在这里解释,但不是完全理解。
你知道怎么解决这个问题吗?
我在r工作
您可以对gsub
使用基于TRE的正则表达式,如
gsub("(benz\s+[[:alpha:]]+)\d\w*", "\1", vec)
参见regex演示。
(benzs+[[:alpha:]]+)
-组1 (1
):benz
,一个或多个空格,一个或多个字母d
-一个数字-w*
- 0个或多个字母、数字或_
.
参见R演示:
vec <- c("2010 mercedes-benz sl500r",
"2010 mercedes-benz e550",
"2010 mercedes-benz glk350",
"2010 mercedes-benz c300w",
"2010 mercedes-benz 300")
gsub("(benz\s+[[:alpha:]]+)\d\w*", "\1", vec)
输出:
[1] "2010 mercedes-benz sl" "2010 mercedes-benz e" "2010 mercedes-benz glk"
[4] "2010 mercedes-benz c" "2010 mercedes-benz 300"
也许这有帮助。指定regex查找以捕获小写字母(([a-z]+)
)并替换为反向引用(\1
)
sub("(?<=benz )([a-z]+).*", "\1", vec, perl = TRUE)
与产出
#[1] "2010 mercedes-benz sl" "2010 mercedes-benz e"
#[3] "2010 mercedes-benz glk" "2010 mercedes-benz c"
#[5] "2010 mercedes-benz 300"
(?<=benz )
) -在空格 后面加一个空格([a-z]+)
-捕获一个或多个字母作为一个组\1
-为捕获组替换的背景参考
vec <- c("2010 mercedes-benz sl500r",
"2010 mercedes-benz e550",
"2010 mercedes-benz glk350",
"2010 mercedes-benz c300w",
"2010 mercedes-benz 300")