2017-02-23 3 views
0

Ich habe eine Zeichenfolge im Format einer URL-Abfrage:Extract Parameter Namen in URL-Abfrage

string <- "key1=value1&key2=value2" 

Und ich möchte alle Parameter Namen extrahieren (key1, key2).

Ich dachte über strsplit mit einem Split alles zwischen = und einem optionalen &.

unlist(strsplit(string, "=.+&?")) 
[1] "key1" 

Aber ich denke, dass dieses Muster passt vom ersten = bis zum Ende des Strings einschließlich meiner optional & im .+. Ich vermute, dass dies wegen der "Gierigkeit" der Regexp ist, also habe ich versucht, es faul zu machen, aber ich habe ein seltsames Ergebnis bekommen.

> unlist(strsplit(string, "=.+?&?")) 
[1] "key1"  "alue1&key2" "alue2" 

Jetzt verstehe ich nicht wirklich das, was hier und ich weiß nicht geschieht, wie ich es faul, wenn optional das letzte passende Zeichen machen.

Ich weiß (und ich denke, ich verstehe auch, warum), dass es funktioniert, wenn ich & von .+ ausschließe, aber ich wünschte, ich könnte verstehen, warum die Regexp oben nicht funktionieren.

> unlist(strsplit(string, "=[^&]+&?")) 
[1] "key1" "key2" 

Meine aktuelle Option ist es mit in 2-mal zu tun:

unlist(sapply(unlist(strsplit(string, "&")), strsplit, split = "=.*", USE.NAMES = FALSE)) 

Was ich falsch mache diese regexp in einer zu erreichen? Danke für jede Hilfe.

Ich bin schmerzlich lernen Regexp, so würde jede andere Optionen auch für mein Wissen geschätzt werden!

+0

Split Argument soll ein Trennzeichen beschreiben, kein Format der Teile, die Sie erhalten möchten – Aaron

+1

Wenn Sie URL-Parameter extrahieren möchten, sollten Sie sich das Paket 'urltools' ansehen. Es kann haben, was Sie brauchen. Wenn Sie stattdessen regexp lernen möchten, lernen Sie auf jeden Fall weiter – GGamba

+0

Relevant/Possible duplicated of http://stackoverflow.com/questions/4350440/split-a-column-of-a-data-frame-to-multiple- Spalten – zx8754

Antwort

0

Zu diesem Zweck (URL-Analyse) zum Scheitern verurteilt bewirkt, dass die beste Ansatz scheint shiny::parseQueryString zu sein, wie @nrussell

shiny::parseQueryString("key1=value1&key2=value2")

vorgeschlagen

enter image description here

0

Ihr erster Ausdruck funktioniert nicht, da Quantoren standardmäßig gierig sind. Deshalb wird .+ so viel wie möglich zusammenpassen. Warum die &? nichts zusammenbringt, wird im nächsten Abschnitt erklärt.

Was ist los mit dem zweiten und verwirrenderen Ausdruck?

Lassen Sie uns einen Blick darauf werfen, was Sie tun.

fehlenden oder (strsplit (string "=. +? &?")) [1] "key1" "alue1 & key2" "alue2"

Sie spalten =v aber warum? Weil du versuchst, es faul zu machen, aber was bedeutet das?

? Lässt den vorhergehenden Quantifizierer träge werden, sodass so wenig wie möglich Zeichen entspricht.

Die geringste Menge an Charakter Ihrer Regex-Übereinstimmungen sind:

= (Fest Zeichen)

+.? (ein oder mehr beliebigen Zeichen)

möglichst wenig hier Übereinstimmungen ist ein Zeichen, das

& in v führt? (wenn dieser Charakter dann auch Übereinstimmung vorhanden ist)

seit dem letzten Ausdruck nur ein Zeichen übereinstimmt, ist der Charakter nach v kein &, die diese regex