Ich möchte eine Zeichenfolge mit R zu analysieren, und ich möchte eine Liste von Objekten erhalten. Klammern, Räume und Komma in der Zeichenfolge, die die Struktur der endgültigen Liste diktieren:Regex Übung in R
1) jedes Paar Klammern durch einen Raum und die Worte in jedem Paar Klammern getrennt wird, hat ein neues Objekt in der Liste zu bilden, ;
2) Wörter in Klammern sind durch ein Komma getrennt und sollten in jedem aufgelisteten Objekt verschiedene Elemente bilden;
3) Die genannte Struktur kann auch in einem Paar Klammern gefunden werden. Hier ist ein Beispiel für die Zeichenfolge:
x <- "(K01596,K01610) (K01689) (K01834,K15633,K15634,K15635) (K00927) (K00134,K00150) (K01803) ((K01623,K01624,K11645) (K03841,K02446,K11532,K01086,K04041),K01622)"
Die gewünschte Ausgabe sollte dies mag:
list(c("K01596","K01610"), "K01689", c("K01834","K15633","K15634","K15635"), "K00927", c("K00134","K00150"), "K01803", list(list(c("K01623","K01624","K11645"), c("K03841","K02446","K11532","K01086","K04041")), "K01622"))
Ich schaffe es zu lösen, wie die Analyse zu tun für Fall 1)
match <- gregexpr("\\((?>[^()]|(?R))*\\)", x, perl = T)
x2 <- as.list(substring(x, match[[1]], match[[1]] + attr(match[[1]], "match.length") - 1))
und Fall 2) ist auch einfach, ich kann einfach die Klammern mit gsub entfernen und die Wörter mit strsplit teilen. Das Problem ist, wie Fall 3) zu analysieren, wenn ich einen verschachtelten Ebene wie haben:
((K01623,K01624,K11645) (K03841,K02446,K11532,K01086,K04041),K01622)
und ich muss ein gelistetes Objekt erhalten, dass eine Liste selbst ist:
list(list(c("K01623","K01624","K11645"), c("K03841","K02446","K11532","K01086","K04041")), "K01622")
ich auf diesem Weg ging und dann aufgegeben. Nette Lösung – akrun
Ich bin nicht vertraut mit JSON-Format, aber scheint mein Problem ziemlich gut zu passen! Wenn möglich, möchte ich jedoch, dass das 7. Element der Liste unterschiedlich strukturiert ist. Wenn Sie den letzten Codeabschnitt ausführen, den ich in der Frage gepostet habe, werden Sie sehen, was ich meine –
Ah, habe das nicht verstanden. Ich habe eine Zeile 'x <- str_replace_all (x," \\ (\\ (. * \\) \\, ", add_paren)' hinzugefügt, die sicherstellen soll, dass alles, was einem Muster ((*) entspricht) verschachtelt wird eine Ebene tiefer, das scheint die gewünschte Ausgabe zu liefern –