r语言 - 用正则表达式擦除已知长度变化的字符串后面的所有内容



我有一堆汽车模型字符串:

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"

  1. (?<=benz )) -在空格
  2. 后面加一个空格
  3. ([a-z]+)-捕获一个或多个字母作为一个组
  4. \1-为捕获组替换的背景参考

数据
vec <- c("2010 mercedes-benz sl500r",
"2010 mercedes-benz e550",
"2010 mercedes-benz glk350",
"2010 mercedes-benz c300w",
"2010 mercedes-benz 300")

最新更新