2014-02-22 11 views
5

Ich möchte Buchstaben aus einer Zeichenfolge löschen, aber bestimmte Wörter schützen. Hier ist ein Beispiel:spezifische Wörter schützen, Buchstaben aus Zeichenfolge löschen

my.string <- "Water the 12 gold marigolds please, but not the 45 trees!" 

desired.result <- "12 marigolds, 45 trees" 

Ich versuchte den Code unten, der ein überraschendes Ergebnis ergab. Ich dachte, () würde schützen, was auch immer es enthielt. Stattdessen passierte genau das Gegenteil. Nur die Wörter innerhalb () wurden gelöscht (plus die !). Hier

gsub("(marigolds|trees)\\D", "", my.string) 

# [1] "Water the 12 gold please, but not the 45 " 

ist ein Beispiel mit einer längeren Zeichenfolge:

my.string <- "Water the 12 gold marigolds please, but not the 45 trees!, The 7 orange marigolds are fine." 

desired.result <- "12 marigolds, 45 trees, 7 marigolds" 

gsub("(marigolds|trees)\\D", "", my.string) 

Returns:

[1] "Water the 12 gold please, but not the 45 , The 7 orange are fine." 

Vielen Dank für jede Beratung. Ich bevorzuge eine regex Lösung in Basis R.

Antwort

2

Eine andere Art und Weise mit einer Erfassungsgruppe:

my.string <- "Water the 12 gold marigolds please, but not the 45 trees!, The 7 orange marigolds are fine." 
gsub("(?i)\\b(?:(marigolds|trees)|[a-z]+)\\b\\s*|[.?!]", "\\1", my.string, perl=TRUE) 
7

Verwenden von Wortgrenzen, negative Look-Ahead-Assertion.

> my.string <- "Water the 12 gold marigolds please, but not the 45 trees!" 
> gsub("\\b(?!marigolds\\b|trees\\b)[A-Za-z]+\\s*", "", my.string, perl=TRUE) 
[1] "12 marigolds , 45 trees!" 
> gsub("\\b(?!marigolds\\b|trees\\b)[A-Za-z]+\\s*|!", "", my.string, perl=TRUE) 
[1] "12 marigolds , 45 trees" 
+0

Danke. Wie würde ich dies ändern, um den letzten Punkt im zweiten Beispiel zu löschen? –

+0

@MarkMiller, meinst du '!'? Ich habe die Antwort aktualisiert. – falsetru

+1

Ich denke, das macht es: 'gsub (" \\ b (?! Ringelblumen \\ b | Bäume \\ b) [A-Za-z] + \\ s * | [!.] "," ", mein .string, perl = TRUE) ' –

Verwandte Themen