R Language
Modyfikowanie ciągów przez podstawienie
Szukaj…
Wprowadzenie
sub
i gsub
służą do edycji napisów przy użyciu wzorców. Zobacz Dopasowywanie i zamiana wzorców, aby uzyskać więcej informacji na temat powiązanych funkcji i Wyrażeń regularnych, aby dowiedzieć się, jak zbudować wzorzec.
Zmień kolejność znaków przy użyciu grup przechwytywania
Jeśli chcesz zmienić kolejność ciągów znaków, możesz użyć nawiasów we pattern
aby zgrupować części łańcucha razem. Grupy te można replacement
argumentem zastępującym przy użyciu kolejnych liczb.
Poniższy przykład pokazuje, jak zmienić kolejność wektora nazw postaci „nazwisko, imię” na wektor postaci „imię nazwisko”.
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"
Jeśli potrzebujesz tylko nazwiska, możesz po prostu odnieść się do pierwszych par nawiasów.
sub("^(.+),\\s(.+)", "\\1", strings)
# [1] "Sigg" "Holt" "Ortega" "De La Torre" "Perkins"
Wyeliminuj zduplikowane kolejne elementy
Powiedzmy, że chcemy wyeliminować zduplikowany element podciąg z ciągu (może to być więcej niż jeden). Na przykład:
2,14,14,14,19
i przekonwertować na:
2,14,19
Za pomocą gsub
możemy to osiągnąć:
gsub("(\\d+)(,\\1)+","\\1", "2,14,14,14,19")
[1] "2,14,19"
Działa również dla więcej niż jednego innego powtórzenia, na przykład:
> gsub("(\\d+)(,\\1)+", "\\1", "2,14,14,14,19,19,20,21")
[1] "2,14,19,20,21"
Wyjaśnijmy wyrażenie regularne:
-
(\\d+)
: Grupa 1 rozdzielona znakiem () i znajduje dowolną cyfrę (przynajmniej jedną). Pamiętaj, że musimy tutaj użyć podwójnego odwrotnego ukośnika (\\
), ponieważ dla zmiennej znakowej odwrotny ukośnik reprezentuje specjalny znak zmiany znaczenia dla ograniczników literałów (\"
lub\'
).\d\
jest równoważne z:[0-9]
. -
,
: Znak interpunkcyjny:,
(możemy zawierać spacji ani żadnych innych separator) -
\\1
: Identyczny ciąg do grupy 1, tzn .: powtórzona liczba. Jeśli tak się nie stanie, to wzór się nie zgadza.
Spróbujmy podobnej sytuacji: wyeliminuj kolejne powtarzające się słowa:
one,two,two,three,four,four,five,six
Następnie po prostu zamień \d
na \w
, gdzie \w
dopasowuje dowolny znak słowa, w tym: dowolną literę, cyfrę lub znak podkreślenia. Jest to równoważne z [a-zA-Z0-9_]
:
> gsub("(\\w+)(,\\1)+", "\\1", "one,two,two,three,four,four,five,six")
[1] "one,two,three,four,five,six"
>
Następnie powyższy wzorzec obejmuje jako przypadek zduplikowaną cyfrę.