2012-09-10 10 views
5

Powiedzmy mam napis: „Yay, ciąg”Korzystanie R do analizowania i powrócić tekst w nawiasie

x <- "This is a string (Yay, string!)" 

chciałbym analizować ciąg i powrócić

Jak to zrobić?

Wypróbowałem kilka grep/grepl/gsub/sub/etc, ale nie mogłem znaleźć właściwej kombinacji regex lub argumentów. Westchnienie. Muszę pracować nad umiejętnościami wyrażeń regularnych.

+0

możliwe duplikat [Ekstrakt informacji wewnątrz wszystkich nawiasach R (regex)] (http://stackoverflow.com/questions/8613237/extract-info-inside-all-parenthesis-in-r-regex) –

+0

Zdecydowanie dupe, ale odpowiedzi wydają się inne. –

+1

'strapplyc' w pakiecie gsubfn obsługuje takie problemy. Wyrażenie regularne w następującym kodzie pasuje do '(', po którym następuje dowolna liczba znaków, które nie są ')' i zwraca część w nawiasach: 'library (gsubfn); strapplyc (x, "\\ (([^)] *)", upraszczanie = PRAWDA) Domyślnie używa wyrażeń regularnych tcl, które są dość szybkie, np. sprawdź przykłady w '? strapplyc' dla tego, który analizuje cały tekst Ulissesa Jamesa Joyce'a w ciągu kilku sekund.Odnośnie nauki o regex, istnieją linki do zasobów regex na stronie głównej gsubfn http://gsubfn.googlecode.com. –

Odpowiedz

7

Oto dwa sposoby na zrobienie go:

One: Znajdź ciąg chcesz i wymienić cały łańcuch z bitem, który został znaleziony. (Znany jako tylnym bazowania)

gsub(".*\\((.*)\\).*", "\\1", x) 
[1] "Yay, string!" 

To działa, ponieważ:

  • użyć wstecznych \\1 odnieść się do dopasowanej ciąg w nawiasach (.*)
  • Skoro chcesz wykluczyć nawiasów w Rzeczywisty ciąg, musisz uciec z nich z \\( i \\).

Dwa: Wymień wszystkie bity nie chcesz z pustymi strunami:

gsub(".*\\(|\\).*", "", x) 
[1] "Yay, string!" 

To działa, ponieważ | działa podobnie do OR.

+0

Czy jest jakaś dokumentacja dotycząca użycia '\\ 1'? Czytałem o tym na dole? Grep, ale go nie rozumiałem. –

+2

@BrandonBertelsen Rozszerzyłem nieco odpowiedź, ale generalnie moja rada jest taka, aby nauczyć się regex z dowolnego miejsca, ale z dokumentów R. Na przykład tutaj znajduje się [samouczek na temat odwołań] (http://www.regular-expressions.info/brackets.html) – Andrie

+0

@BrandonBertelsen Dodałem również przeciwne podejście, tj. Zastąpienie bitów, których nie chcesz, puste struny. – Andrie

2

qdap version 1.1.0 można to zrobić:

library(qdap) 
x <- "This is a string (Yay, string!)" 

bracketX(x) 
bracketXtract(x) 

Plony:

> bracketX(x) 
[1] "This is a string" 
> bracketXtract(x) 
[1] "Yay, string!" 

Choć jeśli nie wiele z tych rzeczy robi potem coraz qdap może być trochę przesada.

Edit: Z przykład Josha ...

> x <- "This is (a) string (Yay, string!)" 
> bracketX(x) 
[1] "This is string" 
> bracketXtract(x) 
[1] "a"   "Yay, string!" 
4

Ponadto, jeśli niektóre ciągi może zawierać kilka podłańcuchów, z których chcesz wyodrębnić, należy użyć wyrażenia regularnego power-tools gregexpr() i regmatches():

x <- "This is (a) string (Yay, string!)" 
pat <- "(?<=\\()([^()]*)(?=\\))" 
regmatches(x, gregexpr(pat, x, perl=TRUE)) 
# [[1]] 
# [1] "a"   "Yay, string!" 
+0

I właśnie tak, teraz widzę, że moja ** odpowiedź ** jest dokładnym duplikatem tego, o którym wspomniał przed chwilą Tyler Rinker powyżej! –

+4

Głosuję, aby zamknąć tę odpowiedź jako dokładny duplikat ... –

+0

To była podstawa funkcji 'bracketX' i' bracketXtract' w 'qdap'. Zadałem pytanie, które jest podobne i podaje jeszcze więcej szczegółów: http://stackoverflow.com/questions/8621066/remove-text-inside-brackets-parens-and-or-braces –

Powiązane problemy