1

I have a bunch of strings of car models:

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

I want to remove everything that is after the first n letters of the model name so here is the wanted output:

c("2010 mercedes-benz sl",
  "2020 mercedes-benz e",
  "2017 mercedes-benz glk",
  "2013 mercedes-benz c",
  "2014 mercedes-benz 300")

The problem is that even if the make is the same, mercedes-benz, model names do not always have the same structure. Meaning that they can start with 0 to 3 letters, and can finish with a letter or not. I want to remove everything that follows the letters, if there are any.

I've tried:

gsub("(?<=benz\\s\\D)\\w*", "", vec, perl=T)

But it doesn't deal with multiple letters models and this:

gsub("(?<=benz\\s\\D*)\\w*", "", vec, perl=T)

Is not proper in regex for a reason explained here but not quite all understood.

Any idea how to solve this?

I work in R.

Bastien
  • 3,007
  • 20
  • 38

2 Answers2

2

May be this helps. Specify the regex lookaround to to capture the lower case letters (([a-z]+)) and replace with the backreference (\\1)

sub("(?<=benz )([a-z]+).*", "\\1",   vec, perl = TRUE)

-output

#[1] "2010 mercedes-benz sl"  "2010 mercedes-benz e" 
#[3] "2010 mercedes-benz glk" "2010 mercedes-benz c"  
#[5] "2010 mercedes-benz 300"

Details

  1. (?<=benz )) - regex lookaround checks for benz followed by a space
  2. ([a-z]+) - capture one or more letters as a group
  3. \\1 - replacement backreference for the captured group

data

vec <- c("2010 mercedes-benz sl500r",
     "2010 mercedes-benz e550",
     "2010 mercedes-benz glk350",
     "2010 mercedes-benz c300w",
     "2010 mercedes-benz 300")
akrun
  • 874,273
  • 37
  • 540
  • 662
2

You can use a TRE based regex with gsub like

gsub("(benz\\s+[[:alpha:]]+)\\d\\w*", "\\1", vec)

See the regex demo.

Details

  • (benz\s+[[:alpha:]]+) - Group 1 (\1): benz, one or more whitespace, and one or more letters
  • \d - a digit -\w* - zero or more letters, digits or _.

See the R demo:

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)

Output:

[1] "2010 mercedes-benz sl"  "2010 mercedes-benz e"   "2010 mercedes-benz glk"
[4] "2010 mercedes-benz c"   "2010 mercedes-benz 300"
Wiktor Stribiżew
  • 607,720
  • 39
  • 448
  • 563