2014-10-03 10 views
6

starałem się zwinąć wszystkie wielokrotności (2 lub więcej) białe znaki wewnątrz elementów wektora w jeden, stosując gsub(), np:R regex: problemy z wektorami znaków zawierających NAS

x1 <- c(" abc", "a b c ", "a b c") 
gsub("\\s{2,}", " ", x1) 
[1] " abc" "a b c " "a b c" 

Ale jako wkrótce jako wektor zawiera NA substytucja nie:

x2 <- c(NA, " abc", "a b c ", "a b c") 
gsub("\\s{2,}", " ", x2) 
[1] NA " " " " " " 

jednak to działa dobrze, jeśli ktoś używa Perl podobny wyrażeń regularnych:

gsub("\\s{2,}", " ", x2, perl = TRUE) 
[1] NA  " abc" "a b c " "a b c" 

Czy ktoś ma sugestie, dlaczego własne wyrażenia regularne R zachowują się w ten sposób? Używam R 3.1.1 na Linux x86-64, jeśli to pomaga.

+0

Czy sprawdziłeś, czy dodano więcej tylnych ukośników? W R jest to dość trudne. Zazwyczaj potrzebujesz trzech, aby rozpoznać tego rodzaju wyrażenia. – Llopis

+0

@Llopis To jest nieprawidłowe. Regex jest w rzeczywistości '\ s', do którego dołączamy pojedynczy ukośnik odwrotny, aby dojść do' \\ s'. – jbaums

+0

Potwierdzono także w systemie OS X. Zarówno '\ s' jak i' [[: space:]] 'wykazują zachowanie, podczas gdy literalny znak spacji (lub klasa znaków spacji/tabulacji) działa dobrze. Myślę, że błąd w R. –

Odpowiedz

2

Nie wyszukałem kodu źródłowego, ale działa również, jeśli użyjemy parametru useBytes=TRUE (bez parametru perl=TRUE). Z pomocy: ", jeśli useBytes jest TRUE, dopasowywanie odbywa się w kolejności bajt po bajcie, a nie po znaku." "Może to być spowodowane przez niepowodzenie w gsub.

Jednak regexpr, regexec i gregexpr każdy znaleźć wszystkie odpowiednie pozycje (Mam podstawione \\s z [[:space:]]: dla czytelności i wykorzystywane tylko wyjście z regexpr.

regexpr("[[:space:]]{2,}", x2) 

## [1] NA 1 1 1 
## attr(,"match.length") 
## [1] NA 5 9 6 

Więc sama regex jest w porządku

Aktualizacja: szybkie spojrzenie na do_gsub w R 3.1.1's grep.c nie przyniosło wiele wglądu (to zakręcony labirynt wypowiedzi if/else :-), ale prawie chcę To jest błąd.

+2

Co? błąd w Regex? Jak ktoś mógł powiedzieć? :-) –

Powiązane problemy