2014-09-07 10 views
31

Voglio unire più spazi in uno spazio singolo (lo spazio potrebbe essere anche scheda) e rimuovere gli spazi finali/iniziali.Unisci più spazi in spazio singolo; rimuovere gli spazi finali/iniziali

Per esempio ...

string <- "Hi  buddy  what's up Bro" 

a

"Hi buddy what's up bro" 

ho controllato la soluzione data al Regex to replace multiple spaces with a single space. Si noti che non inserire \ t o \ n come spazio esatto all'interno della stringa del giocattolo e alimentarlo come modello in gsub. Lo voglio in R.

Nota che non riesco a mettere più spazio nella stringa di giocattoli. Grazie

+0

Se avete letto il mio Q con attenzione, alla fine, è possibile creare una stringa giocattolo con più spazi e poi rispondi al mio Q. Ho detto sopra che non riesco a mettere più spazio nella stringa giocattolo come stackoverlfow rimosso automaticamente dalla mia query. – chandresh

+3

'gsub ("^* | (? <=) | * $ "," ", X, perl = TRUE)' –

+0

Ciao David, che funziona per me. Ma puoi spiegarmi che cosa sta facendo esattamente lo schema. i.e^* | (? <=) | * $ dice, sostituisci tutto con lo spazio "" ma * | (? <=) | * $? ? è corretto? come risolve il mio problema Voglio sapere. – chandresh

risposta

33

Questo sembra soddisfare le vostre esigenze.

string <- " Hi buddy what's up Bro " 
library(stringr) 
str_replace(gsub("\\s+", " ", str_trim(string)), "B", "b") 
# [1] "Hi buddy what's up bro" 
+0

Grazie per la tua risposta. Infatti volevo solo gsub parte perché non intendevo sostituire B a b. Il punto in cui mi sono bloccato è stato trovare lo schema per fare una cosa del genere. Potresti spiegarmi il significato di \\ s +? – chandresh

+2

@chandresh - '\\ s +' significa "uno o più spazi" –

+1

Vale la pena notare a questo punto che questa è l'unica risposta che risolve cambiando il maiuscolo b in "Bro" in minuscolo, come mostrato nel risultato desiderato della domanda. –

3

Si potrebbe anche provare clean da qdap

library(qdap) 
library(stringr) 
str_trim(clean(string)) 
#[1] "Hi buddy what's up Bro" 

O come suggerito da @Tyler Rinker (utilizzando solo qdap)

Trim(clean(string)) 
#[1] "Hi buddy what's up Bro" 
+1

Si può fare tutto da 'qdap' tramite' Trim (clean (string)) '. –

+0

@Tyler Rinker Grazie per aver suggerito "Trim". – akrun

24

Un altro approccio utilizzando un unico regex:

gsub("(?<=[\\s])\\s*|^\\s+|\\s+$", "", string, perl=TRUE) 

Spiegazione (from)

NODE      EXPLANATION 
-------------------------------------------------------------------------------- 
    (?<=      look behind to see if there is: 
-------------------------------------------------------------------------------- 
    [\s]      any character of: whitespace (\n, \r, 
          \t, \f, and " ") 
-------------------------------------------------------------------------------- 
)      end of look-behind 
-------------------------------------------------------------------------------- 
    \s*      whitespace (\n, \r, \t, \f, and " ") (0 or 
          more times (matching the most amount 
          possible)) 
-------------------------------------------------------------------------------- 
|      OR 
-------------------------------------------------------------------------------- 
^      the beginning of the string 
-------------------------------------------------------------------------------- 
    \s+      whitespace (\n, \r, \t, \f, and " ") (1 or 
          more times (matching the most amount 
          possible)) 
-------------------------------------------------------------------------------- 
    $      before an optional \n, and the end of the 
          string 
+1

Riner. Grazie per la tua illustrazione. – chandresh

+0

@MichaelChirico Grazie sentitevi liberi di apportare la modifica. –

4

Il qdapRegex ha la funzione rm_white per gestire questa situazione:

library(qdapRegex) 
rm_white(string) 

## [1] "Hi buddy what's up Bro" 
Problemi correlati