2016-04-19 20 views
2

Ich versuche, eine Regex zu schreiben, die alle Werte ersetzt, die keine * mit enthalten. Kann jemand erklären, wie man einen Escape-Charakter in einem R-Style (PCRE?) Regex korrekt negiert?übereinstimmende Escape-Zeichen in R-Stil Regex

temp<-data.frame(c("hi","keep**",NA),c("keep***",NA,"xxx")) 
lapply(temp,function(x){gsub("[^\\*]",NA,x)}) #This did not work like I thought it would 

GOAL

NA keep*** 
keep* NA 
NA NA 
+0

Wird die Sternchen immer am Ende des Wortes? – excaza

+0

Vielleicht, 'lapply (temp, Funktion (x) {gsub ("^[^ *] * $ ", NA, x)})'? –

+0

@ WiktorStribiżew das war genau das, was ich brauchte. Wirst du es als Antwort darstellen und erklären, warum du^zweimal benutzt hast? – Rilcon42

Antwort

2

Es ist das Hauptproblem scheint, ist, dass Sie nur ein Zeichen passen, die mit [^\\*] nicht ein Stern ist, und ersetzen Sie es mit NAgsub verwenden, während Sie ganz ersetzen müssen Werte (= Zeichenfolgen).

Verwendung ^[^*]*$:

  • ^ - Beginn der Zeichenfolge
  • [^*]* - Streichhölzer 0+ Zeichen (aufgrund der * quantifier am Ende), die nicht * (die [^...] ist eine negierte Zeichenklasse, die stimmt mit allen Zeichen überein, die nicht in der Klasse definiert sind)
  • $ - Ende der Zeichenfolge.

Da die Regex in gsub ohne perl=T verwendet wird, kann man nicht entkommen Zeichen verwendet in der Zeichenklasse, wird es von der TRE verboten (abgeleitet von POSIX) regex Geschmack.

1

Der Zeichenklassenoperator erlaubt Negation, wenn Sie das erste Zeichen "^" machen, aber da eine "nackte" NA kein Zeichenwert ist, ist das nicht genug. Sie müssen den meisten Sonderzeichen in einer Zeichenklassensequenz nicht entkommen. Sie benötigen eine andere Strategie, um ausgewählte Artikel NA bedingt herzustellen. Für eine Sache hast du eine verkleidete Faktor-Verwirrung. Ich dachte ifelse war eine gute Strategie. R macht automatisch Zeichenwerte zu Faktoren, die kein Ende der Verwirrung verursachen. Verwenden Sie stringsAsFactors = FALSCH oder lapply(dfrm, as.character) zu vermeiden oder zu beheben:

> temp<-data.frame(a=c("hi","keep**",NA),b=c("keep***",NA,"xxx"), stringsAsFactors=FALSE) 
> lapply(temp,function(x){ifelse(!grepl("[*]",x) , NA, x)}) 
$a 
[1] NA  "keep**" NA  

$b 
[1] "keep***" NA  NA  
0

Nicht die beste, aber das auch

arbeiten
temp<-data.frame(c("hi","keep**",NA),c("keep***",NA,"xxx")) 
lapply(temp,function(x){gsub("(?!.*\\*)(\\w+)", NA, x, perl=T)}) 
Verwandte Themen