2016-12-16 2 views
-1

Ich versuche, die Servernamen (server101) aus dieser Zeichenfolge in R mit regulärem Ausdruck zu extrahieren:Wie extrahieren Sie Werte zwischen zwei Zeichen in R?

Wert zwischen @ und dem folgenden ersten Zeitraum

t<-c("Current CPU load - jvm machine[example network-app_svc_group_mem4]@server101.example.com") 

I‘(.) habe es versucht:

gsub('.*\\@(\\d+),(\\d+).*', '\\1', t) 

das scheint nicht zu funktionieren, irgendwelche Ideen?

+0

'gsub ('@ ([. ^] +) |', '\\ 1', t)' – rawr

Antwort

2

mit stringr:

library(stringr) 
str_match(t, ".*@([^\\.]*)\\..*")[2] 
#[1] "server101" 
+0

Nur FYI: 'str_match' erfordert keine vollständige Zeichenfolge übereinstimmen. Außerdem wird der Punkt in einer Zeichenklasse als Literalpunkt behandelt und muss nicht maskiert werden. Da nach '@' ein gewisser Wert erwartet wird, ist '+' (1 oder mehr Vorkommen) logischer als '*' (null oder mehr Vorkommen). Daher würde ich das folgende Muster mit 'str_match' verwenden:' "@ ([^.] +)" '. –

+0

Danke @ WiktorStribiżew für die Informationen, sehr geschätzt. –

1

Sie den folgenden Basen R-Code verwenden können 1+ andere Zeichen als . ([^.]+) nach den ersten @ zu extrahieren:

> t <- "Current CPU load - jvm machine[example network-app_svc_group_mem4]@server101.example.com" 
> pattern="@([^.]+)" 
> m <- regmatches(t,regexec(pattern,t)) 
> result = unlist(m)[2] 
> result 
[1] "server101" 

Mit regexec, können Sie Zugriff auf Submatches (Erfassen von Gruppeninhalten).

Siehe online R demo

Ein anderer Weg regmatches/regexpr mit PCRE regex mit einem (?<[email protected]) Lookbehind, die nur prüfen, ob die Zeichen Anwesenheit zu verwenden ist, aber nicht den Charakter in das Spiel hat gesagt:

> result2 <- regmatches(t, regexpr("(?<[email protected])[^.]+", t, perl=TRUE)) 
> result2 
[1] "server101" 

Eine saubere stringr Ansatz wäre, die gleiche PCRE Regex mit str_extract (die eine ähnliche verwendet (weil es auch Lookarounds unterstützt), ICU, Regex Geschmack):

> library(stringr) 
> t<-c("Current CPU load - jvm machine[example network-app_svc_group_mem4]@server101.example.com") 
> str_extract(t, "(?<[email protected])[^.]+") 
[1] "server101" 
Verwandte Themen