2017-11-30 2 views
1

Ich versuche, einen Textblock zu entfernen, der um das, was ich behalten möchte, umschließt. Also wollte ich Variablen zuweisen, da der Text lang sein kann. Dies ist ein Beispiel für das, was ich versuche zu tun. [Hat Entfernen Sie nicht den Text]gsubfn | Ersetzen Sie Text mithilfe von Variablen in Substitution

Text<-'This is an example text [] test' 
topheader<-'This' 
bottomheader<-'test' 


gsubfn(".", list(topheader = "", bottomheader = ""), Text) 
[1] "This is an example text [] test" 


Goal: "is an example text []" 
+0

Was tun Sie möchten entfernen, was möchten Sie behalten? – AkselA

+0

entfernen Sie "diese" und "testen". Halte alles in der Mitte –

+1

Würde 'gsub (" This | test "," ", Text)' ausreichen? Oder 'gsub (" \\ bThis \ b \\ btest \\ b "," ", Text)'? Groß- und Kleinschreibung beachten? – AkselA

Antwort

0

1) unter Verwendung von gsubfn Es gibt mehrere Probleme hier:

  • Der reguläre Ausdruck in gsubfn (und in gsub) muss mit der Zeichenfolge übereinstimmen, die Sie verarbeiten möchten, aber ein Punkt entspricht nur einem einzelnen Zeichen, sodass er This oder test, die 4 Zeichenfolgen entsprechen, nicht übereinstimmen kann. Verwenden Sie stattdessen "\\w+".

  • In list(a = x) muss die a eine Konstante sein, keine Variable. Schreiben Sie die Namen explizit aus oder verwenden Sie stattdessen setNames, wenn sie in Variablen enthalten sind.

So den Code in der Frage zu beheben:

library(gsubfn) 

trimws(gsubfn("\\w+", list(This = "", text = ""), Text)) 
## [1] "is an example [] test" 

oder in Bezug auf die Header-Variablen:

L <- setNames(list("", ""), c(topheader, bottomheader)) 
trimws(gsubfn("\\w+", L, Text)) 
## [1] "is an example [] test" 

Beachten Sie, dass dies jedes Auftreten von topheader ersetzen wird und bottomheader und nicht nur diejenigen am Anfang und am Ende; Dies scheint jedoch Ihrem Code am nächsten zu sein, der wahrscheinlich ausreichend ist.

2) Unter Eine weitere Möglichkeit besteht darin, diese einfache sub

sub("^This (.*) text$", "\\1", Text) 
[1] "is an example [] test" 

oder in Bezug auf die Header-Variablen:

pat <- sprintf("^%s (.*) %s$", topheader, bottomheader) 
sub(pat, "\\1", Text) 
## [1] "is an example [] test" 

Update: Feste (1)

0

Ich denke, das eine Lösung ist, was Sie suchen:

# Your data: 
Text<-'This is an example text [] test' 
topheader<-'This' 
bottomheader<-'test' 

# A possible solution fn 
gsubfn <- function(text, th, bh, th.replace="", bh.replace="") { 
    answer <- gsub(text, 
       pattern=paste0(th," (.*) ",bh), 
       replacement=paste0(th.replace,"\\1",bh.replace) 
       ) 
    return(answer) 
    } 

# Your req'd answer 
gsubfn(text=Text,th=topheader,bh=bottomheader) 

# Another example 
gsubfn(text=Text,th=topheader,bh=bottomheader,th.replace="@@@ ",bh.replace=" ###") 
+0

Eine Warnung ist, nach Mustern in Ihrem "Text" Ausschau zu halten, die übereinstimmen würden, wenn gsub versucht, Ihre "Vorsätze" zu entsprechen.In einem solchen Fall macht das Hinzufügen eines "^" und eines "$" am Anfang und am Ende des Musterarguments dies etwas robuster. – Nate

0

Sie können einfach Ihre Suchwörter in einen regulären Ausdruck String kollabieren.

Test <- 'This is an example text testing [] test' 

top <- "This" 
bottom <- "test" 

arg <- c(top, bottom) 
arg <- paste(arg, collapse="|") 
arg <- gsub("(\\w+)", "\\\\b\\1\\\\b", arg) 

Test.c <- gsub(arg, "", Test) 
Test.c <- gsub("[ ]+", " ", Test.c) 
Test.c <- gsub("^[[:space:]]|[[:space:]]$", "", Test.c) 
Test.c 
# "is an example text []" 

Oder magrittr Rohre

library(magrittr) 

c(top, bottom) %>% 
paste(collapse="|") %>% 
gsub("(\\w+)", "\\\\b\\1\\\\b", .) %>% 
gsub(., "", Test) %>% 
gsub("[ ]+", " ", .) %>% 
gsub("^[[:space:]]|[[:space:]]$", "", .) -> Test.c 
Test.c 
# "is an example text []" 

oder mit einer Schleife

Test.c <- Test 
words <- c(top, bottom) 
for (i in words) { 
    Test.c <- gsub(paste0("\\\\b", i, "\\\\b"), "", Test) 
} 
Test.c <- gsub("[ ]+", " ", Test.c) 
Test.c <- gsub("^[[:space:]]|[[:space:]]$", "", Test.c) 
Test.c 
# "is an example text []" 
Verwandte Themen