2016-06-21 15 views
1

Ich habe eine Zeichenfolge wie folgtEntfernen angegebenen Muster aus Zeichenfolge in R

s <- "abc a%bc 1.2% 234 1.2 (1.4%)) %3ed" 

Ich mag würde alle „Wörter“, die die% haben zu entfernen. So wäre die Folge

"abc 234 1.2" 
+0

Welche Probleme haben Sie mit Ihrem Code zu haben? – Jota

+0

Ich weiß nicht, wie ich vorgehen soll –

+0

Ich würde einen Blick auf die 'Gsub'-Funktion werfen, um loszulegen. – Jota

Antwort

3

Sie können

> gsub("^\\s+|\\s+$", "", (gsub("\\s+", " " ,gsub("\\s+\\S*%\\S*(?=\\s+|$)", " ",input, perl=TRUE)))) 
#[1] "abc 234 1.2" 

-Code Aufteilung

gsub("^\\s+|\\s+$", "", (gsub("\\s+", " " ,gsub("\\s+\\S*%\\S*(?=\\s+|$)", " ",input, perl=TRUE)))) 
              <---------------------------------------------------> 
                Remove strings with % 
         <------------------------------------------------------------------------> 
         Substitute extra spaces with single space from resultant string obtained from above 
<--------------------------------------------------------------------------------------------------> 
     Trim initial and final whitespaces from the string obtained from above 

Regex Pannen

\\s+ #Match whitespaces 
\\S* #Match all non whitespace character before % if its there 
% #Match % literally 
\\S* #Match all non whitespace character after % if its there 
(?=\\s+|$) #Lookahead to check whether there is a space or end of string after matching word with % 
+0

Könnte den Teil \\ S *% \\ S * (? = \\ s + | $) Ihrer Lösung erklären? –

+0

Thnx @ rock321987 für die detaillierte Lösung –

+0

@dimitris_ps Sie sind willkommen – rock321987

1

Sie diese verwenden können

library(stringr) 
s <- "abc a%bc 1.2% 234 1.2 (1.4%)) %3ed" 
words<-unlist(str_split(s," ")) 
ind<-which(is.na(str_locate(unlist(str_split(s," ")),"%")[,1])) 
vec<-words[ind] 
res<-paste(vec, collapse = ' ') 
res 
1

Sie können auch str_extract_all von stringr Paket verwenden:

stringr::str_extract_all(s, "(?<=^|\\s)[^%\\s]+(?=\\s|$)") 
[[1]] 
[1] "abc" "234" "1.2" 

(?<=^|\\s) steht für hinter der Suche entweder den Anfang der Zeichenfolge oder einem weißen Raum;

[^%\\s]+ stimmt mit einem Wort überein, das % und Leerzeichen nicht enthält;

(?=\\s|$) steht für einen Blick auf das Ende der Zeichenfolge oder einen Leerraum;

+0

Warum enthalten Sie '()' und '|' innerhalb der Zeichenklasse? – rock321987

+0

@ rock321987 Können Sie ein bisschen genauer sein? Ich glaube nicht, dass ich verstehe, was du meinst. – Psidom

+0

'[]' ist eine Zeichenklasse..so bedeutet es, dass jedes Zeichen wörtlich behandelt wird. "[^ (% | \\ s)]' bedeutet, dass alles außer '(','% ',' | ', '\ s' oder') ' – rock321987

1

Wie dieser einfachen Ansatz Basis R:

s <- "abc a%bc 1.2% 234 1.2 (1.4%)) %3ed" 
spl <- unlist(strsplit(s, " ")) 
spl[!grepl("%", spl)] 

#[1] "abc" "234" "1.2" 
Verwandte Themen