2015-07-10 5 views
12

Ich habe eine Zeichenfolge.Wie lösche ich ein Segment einer Zeichenfolge mit einem bestimmten Anfang und Ende in R mit regulären Ausdrücken?

str = c("F14 : M114L","W15 : M116L, W15 : M118L","W15 : D111L, F14 : E112L, F14 : M116L") 

Das Ziel ist, etwas zwischen zu löschen: und L (enthält auch den weißen Raum direkt vor :), so dass ich am Ende würde

"F14", "W15, W15", "W15, F14, F14" 

mit Ich denke mit

gsub(" : [[:alnum:]]L", "", str) 

Aber klar es funktioniert nicht. Sie wissen nicht, ob es so etwas wie ein Platzhalter ist, die zwischen einer beliebigen Anzahl von Ziffern und Zeichen darstellen können: und L.

+2

Ich denke, ein '+' wird es tun: 'gsub (": [[: alnum:]] + L", "", str)' – Frank

+0

Es klappt. Habe seit einiger Zeit keine regulären Ausdrücke mehr verwendet. Ich habe [[: alnum:]] nur Konten für einen Buchstaben oder eine Zahl vergessen. – wen

Antwort

7

Dies wird es tun:

gsub(" : .*?L", "", str) 
#[1] "F14"   "W15, W15"  "W15, F14, F14" 
+0

Ist das '?' 'Sagen'. * 'Zu stoppen, wenn es ein' L' trifft, es nongriery oder etwas machend? Ich habe nur '?' Als Quantifizierer gesehen bevor – Frank

+1

@Frank Genau, das '?' Nach einem Quantifier macht es nicht gierig. Es wird zu einem "faulen" Quantifizierer. – Jota

+7

Ich sehe Doppel. –

6

Paar von Ansätzen.

Nehmen Sie die ersten Buchstaben, wenn es immer drei ist:

substr(str,1,3) 

Ich persönlich mag stringr auch. Es macht die Extraktion sehr einfach. Muster, was du willst, nicht das, was du nicht willst.

library(stringr) 
str_extract(str,"[A-Z][0-9]*") 

Ich habe diese für einen Vektor vereinfacht, aber Sie Unterelemente haben, können Sie so etwas wie benötigen:

splits <- strsplit(str,", ") 
result <- lapply(splits, substr, start = 1, stop = 3) 

oder

result <- lapply(splits, str_extract, pattern = "[A-Z][0-9]*") 
+0

Ah ja, für die substr Lösung. Guter Fang. –

7

Sie können diese Leichtigkeit tun mit mit dem qdapRegex paket, das ich pflege:

str = c("F14 : M114L","W15 : M116L, W15 : M118L","W15 : D111L, F14 : E112L, F14 : M116L") 

library(qdapRegex) 
rm_between(str, "\\s:", "L") 
## [1] "F14"   "W15, W15"  "W15, F14, F14" 

qdapRegex soll nützlich sein, wie es lehrt. Wenn Sie Interesse an der Regex verwendet werden, sind ...

S("@rm_between", "\\s:", "L") 
## [1] "(\\s:)(.*?)(L)" 

gsub(S("@rm_between", "\\s:", "L") , "", str)