2015-08-02 21 views
6

Próbuję wydobyć znaków przed i po znaku „/” za pomocą R.Wyciąg znaków aż do „/” za pomocą R

Na przykład, można uzyskać z następujących tagów:

s <- "hello/JJ world/NN" 

# get the tags 
sapply(s, function(x){gsub("([a-z].*?)/([A-z].*?)", "\\2", x)}) 

która zwraca

"JJ NN" 

jednak, gdy staram się wydobyć znaki przed „/” lub „żetonów”, przy użyciu następujących:

sapply(s, function(x){gsub("([a-z].*?)/([A-z].*?)", "\\1", x)}) 

uzyskać

"helloJ worldN" 

Jak mogę dostać "Hello World" i dlaczego jest pierwszą literą z tagiem poślizgu w środku?

+0

używasz sapply na wektorze o długości jeden. dlaczego nie tylko 'gsub ('/ [az] +', '', s, ignore.case = TRUE)' i 'gsub ('[az] + /', '', s, ignore.case = TRUE)' ? – rawr

+0

Spróbuj 'gsub ('/ \\ w +', '', s)' – akrun

Odpowiedz

3

Myślę, że powodem, dla którego otrzymujesz te litery pozostające na wyjściu, jest twoje wyrażenie regularne. [A-Z] (nie musi być Z Chyba z jest literówka - patrz [A-Za-z] Shorthand class?) jest OK, ale to następuje .*? leniwy dot grupy pasującej że może się równać 0 lub nieograniczone znaki inne niż nowa linia możliwie jak najmniej. Tak, to will match none.

trzeba + kwantyfikator pasujące do 1 lub więcej znaków i zastosować go do klasy postaci [a-zA-Z]:

s <- "hello/JJ world/NN" 
sapply(s, function(x){gsub("([a-zA-Z])/[a-zA-Z]+", "\\1", x)}) 

Zobacz demo

usunąłem drugą grupę, ponieważ nie jest on używany.

+0

lub możesz po prostu skopiować/wkleić dane wyjściowe poniżej kodu? – rawr

Powiązane problemy