2012-11-21 7 views

Odpowiedz

29

wolę używać gsub() na to:

gsub(".*\\((.*)\\).*", "\\1", df) 
[1] "id-1290" 

regex działa tak:

  • Znajdź tekst wewnątrz nawiasów - nie twoje prawdziwe nawiasy, ale mój dodatkowy zestaw nawiasy, tj. (.*)
  • Zwróć to jako odnośnik, \\1

Innymi słowy zastąpić cały tekst w ciąg z tyłu odniesienia


Jeśli chcesz użyć regexp zamiast gsub, to zrobić:

x <- regexpr("\\((.*)\\)", df) 
x 

[1] 11 
attr(,"match.length") 
[1] 9 
attr(,"useBytes") 
[1] TRUE 

ta zwraca wartość 11, tj. pozycja początkowa znalezionego wyrażenia. Zwróć też uwagę na atrybut match.length, który wskazuje, ile znaków zostało dopasowanych.

Można wyodrębnić ten z attr:

attr(x, "match.length") 
[1] 9 

a następnie użyć substring wyodrębnić znaki:

substring(df, x+1, x+attr(x, "match.length")-2) 
[1] "id-1290" 
2

Oto nieco inny sposób, przy użyciu lookbehind/przyszłość:

df <- "Peoplesoft(id-1290)" 
regmatches(df,gregexpr("(?<=\\().*?(?=\\))", df, perl=TRUE)) 

Różnica z odpowiedzią Andrie jest taka, że ​​również orks, aby wyodrębnić wiele ciągów w nawiasach. na przykład:

df <- "Peoplesoft(id-1290) blabla (foo)" 
regmatches(df,gregexpr("(?<=\\().*?(?=\\))", df, perl=TRUE)) 

Daje:

[[1]] 
[1] "id-1290" "foo" 
Powiązane problemy