R Language
Modifica delle stringhe per sostituzione
Ricerca…
introduzione
sub
e gsub
sono usati per modificare stringhe usando pattern. Vedi Pattern Matching and Replacement per maggiori informazioni sulle funzioni correlate e sulle espressioni regolari su come costruire un pattern.
Riordina le stringhe di caratteri usando i gruppi di cattura
Se si desidera modificare l'ordine di una stringa di caratteri, è possibile utilizzare le parentesi nel pattern
per raggruppare parti della stringa. Questi gruppi possono essere aggiunti nell'argomento replacement
utilizzando numeri consecutivi.
L'esempio seguente mostra come riordinare un vettore di nomi del modulo "cognome, nome" in un vettore del modulo "nome cognome".
library(randomNames)
set.seed(1)
strings <- randomNames(5)
strings
# [1] "Sigg, Zachary" "Holt, Jake" "Ortega, Sandra" "De La Torre, Nichole"
# [5] "Perkins, Donovon"
sub("^(.+),\\s(.+)$", "\\2 \\1", strings)
# [1] "Zachary Sigg" "Jake Holt" "Sandra Ortega" "Nichole De La Torre"
# [5] "Donovon Perkins"
Se hai solo bisogno del cognome potresti semplicemente indirizzare le prime coppie di parentesi.
sub("^(.+),\\s(.+)", "\\1", strings)
# [1] "Sigg" "Holt" "Ortega" "De La Torre" "Perkins"
Elimina elementi consecutivi duplicati
Diciamo che vogliamo eliminare l'elemento di sottosuccessione duplicato da una stringa (può essere più di uno). Per esempio:
2,14,14,14,19
e convertirlo in:
2,14,19
Usando gsub
, possiamo ottenerlo:
gsub("(\\d+)(,\\1)+","\\1", "2,14,14,14,19")
[1] "2,14,19"
Funziona anche per più di una ripetizione, ad esempio:
> gsub("(\\d+)(,\\1)+", "\\1", "2,14,14,14,19,19,20,21")
[1] "2,14,19,20,21"
Spieghiamo l'espressione regolare:
-
(\\d+)
: un gruppo 1 delimitato da () e trova qualsiasi cifra (almeno una). Ricordare che è necessario utilizzare il doppio backslash (\\
) qui perché per una variabile di carattere una barra rovesciata rappresenta un carattere di escape speciale per i delimitatori di stringa letterali (\"
o\'
).\d\
è equivalente a:[0-9]
. -
,
: Un segno di punteggiatura:,
(possiamo includere spazi o qualsiasi altro delimitatore) -
\\1
: una stringa identica al gruppo 1, vale a dire: il numero ripetuto. Se ciò non accade, allora il modello non corrisponde.
Proviamo una situazione simile: elimina le parole ripetute consecutive:
one,two,two,three,four,four,five,six
Quindi, sostituisci \d
con \w
, dove \w
corrisponde a qualsiasi carattere di parola, inclusi: qualsiasi lettera, cifra o underscore. È equivalente a [a-zA-Z0-9_]
:
> gsub("(\\w+)(,\\1)+", "\\1", "one,two,two,three,four,four,five,six")
[1] "one,two,three,four,five,six"
>
Quindi, il modello sopra riportato include un caso di cifre duplicate caso particolare.