Hi, Can anyone please assist. given the string> x<-"/mnt/AO/AO Data/S01-012/120824/"I would like to extract "S01-012" require(stringr)> str_match(x,"\\/mnt\\/AO\\/AO Data\\/(.+)\\/+") > str_match(x,"\\/mnt\\/AO\\/AO Data\\/(\\w+)\\/+")both nearly work. I expected I would use something like:> str_match(x,"\\/mnt\\/AO\\/AO Data\\/([\\w -]+)\\/+")but I don't seem able to get the square bracket grouping to work correctly. Can someone please show me where I am going wrong? Thanks, Tom
> -----Original Message----- > > x<-"/mnt/AO/AO Data/S01-012/120824/" > > I would like to extract "S01-012"> gsub("/mnt/AO/AO Data/(.+)/.+", "\\1", x)#does it, as does> gsub("/mnt/AO/AO Data/([\\w-]+)/.+", "\\1", x, perl=TRUE) # \w is perl RE; the default is POSIX, which would be. > gsub("/mnt/AO/AO Data/([[:alnum:]-]+)/.+", "\\1", x)#and> str_match(x,"/mnt/AO/AO Data/(.+)/.+") > str_match(x,"/mnt/AO/AO Data/([[:alnum:]-]+)/.+") #again, needs POSIX, not perl REYou had also, btw, missed the '.' in the closing '.+', meaning that your regex was looking for '/+', that is, multiple instances of '/' Steve E ******************************************************************* This email and any attachments are confidential. Any use...{{dropped:8}}
On Aug 15, 2014, at 11:18 AM, Tom Wright <tom at maladmin.com> wrote:> Hi, > Can anyone please assist. > > given the string > >> x<-"/mnt/AO/AO Data/S01-012/120824/" > > I would like to extract "S01-012" > > require(stringr) >> str_match(x,"\\/mnt\\/AO\\/AO Data\\/(.+)\\/+") >> str_match(x,"\\/mnt\\/AO\\/AO Data\\/(\\w+)\\/+") > > both nearly work. I expected I would use something like: >> str_match(x,"\\/mnt\\/AO\\/AO Data\\/([\\w -]+)\\/+") > > but I don't seem able to get the square bracket grouping to work > correctly. Can someone please show me where I am going wrong? > > Thanks, > TomIs the desired substring always in the same relative position in the path? If so:> strsplit(x, "/")[[1]] [1] "" "mnt" "AO" "AO Data" "S01-012" "120824"> unlist(strsplit(x, "/"))[5][1] "S01-012" Alternatively, again, presuming the same position:> gsub("/mnt/AO/AO Data/([^/]+)/.+", "\\1", x)[1] "S01-012" You don't need all of the double backslashes in your regex above. The '/' character is not a special regex character, whereas '\' is and needs to be escaped. Regards, Marc Schwartz
Hello, I don't believe you need an extra package for that. Try sub("\\/mnt\\/AO\\/AO Data\\/([-[:alnum:]]*)\\/.+", "\\1", x) or, with package stringr, str_match(x,"\\/mnt\\/AO\\/AO Data\\/(.+)\\/.+") Hope this helps, Rui Barradas Em 15-08-2014 17:18, Tom Wright escreveu:> Hi, > Can anyone please assist. > > given the string > >> x<-"/mnt/AO/AO Data/S01-012/120824/" > > I would like to extract "S01-012" > > require(stringr) >> str_match(x,"\\/mnt\\/AO\\/AO Data\\/(.+)\\/+") >> str_match(x,"\\/mnt\\/AO\\/AO Data\\/(\\w+)\\/+") > > both nearly work. I expected I would use something like: >> str_match(x,"\\/mnt\\/AO\\/AO Data\\/([\\w -]+)\\/+") > > but I don't seem able to get the square bracket grouping to work > correctly. Can someone please show me where I am going wrong? > > Thanks, > Tom > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >
WOW!!! What can I say 4 answers in less than 4 minutes. Thank you everyone. If I can't make it work now I don't deserve to. btw. the strsplit approach wouldn't work for me as: a) I wanted to play with regex and b) the location isn't consistent. Nice to see email support still works, not everything has moved to linkedin and stackoverflow. Thanks again, Tom On Fri, 2014-08-15 at 12:18 -0400, Tom Wright wrote:> Hi, > Can anyone please assist. > > given the string > > > x<-"/mnt/AO/AO Data/S01-012/120824/" > > I would like to extract "S01-012" > > require(stringr) > > str_match(x,"\\/mnt\\/AO\\/AO Data\\/(.+)\\/+") > > str_match(x,"\\/mnt\\/AO\\/AO Data\\/(\\w+)\\/+") > > both nearly work. I expected I would use something like: > > str_match(x,"\\/mnt\\/AO\\/AO Data\\/([\\w -]+)\\/+") > > but I don't seem able to get the square bracket grouping to work > correctly. Can someone please show me where I am going wrong? > > Thanks, > Tom >
Hi Tom, You could try: library(stringr) str_extract(x, perl("(?<=[A-Za-z]{4}/).*(?=/[0-9])")) #[1] "S01-012" A.K. On Friday, August 15, 2014 12:20 PM, Tom Wright <tom at maladmin.com> wrote: Hi, Can anyone please assist. given the string> x<-"/mnt/AO/AO Data/S01-012/120824/"I would like to extract "S01-012" require(stringr)> str_match(x,"\\/mnt\\/AO\\/AO Data\\/(.+)\\/+") > str_match(x,"\\/mnt\\/AO\\/AO Data\\/(\\w+)\\/+")both nearly work. I expected I would use something like:> str_match(x,"\\/mnt\\/AO\\/AO Data\\/([\\w -]+)\\/+")but I don't seem able to get the square bracket grouping to work correctly. Can someone please show me where I am going wrong? Thanks, Tom ______________________________________________ R-help at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.