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:

  1. (\\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] .
  2. , : Znak interpunkcyjny: , (możemy zawierać spacji ani żadnych innych separator)
  3. \\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ę.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow