2016-11-16 7 views
1

Es muss eine einfache Antwort darauf geben, aber ich bin neu in Regex und konnte keinen finden.Erhalte die Anzahl der Phrasen, die in Klammern enthalten sind und ein bestimmtes Zeichen enthalten

Ich habe ein Datenframe (df) mit Textzeichenfolgen angeordnet in einem Spaltenvektor der Länge n (df $ text). Jeder der Texte in dieser Spalte ist mit Klammern in Klammern versehen. Ich kann diese Phrasen identifizieren:

regmatches(df$text, gregexpr("(?<=\\().*?(?=\\))", df$text, perl=T))[[1]] 

Der obige Code gibt alle Text in Klammern. Ich bin jedoch nur an Klammern interessiert, die "v." Enthalten. im Format 'x v. y', wobei x und y eine beliebige Anzahl von Zeichen (einschließlich Leerzeichen) zwischen den Klammern sind; zum Beispiel "(Bundesstaat Arkansas v. John Doe)". Passende Phrasen (Gerichtsfälle) haben immer dieses Format: offene Klammern, Wort beginnt mit Großbuchstaben, mögliche Leerzeichen und andere Wörter, v., Ein anderes Wort, das mit einem Großbuchstaben beginnt, und möglicherweise mehr Leerzeichen und Wörter, enge Klammern.

Ich würde dann gerne eine neue Spalte mit Zählungen von x v. Y Phrasen in jeder Zeile erstellen.

Bonus, wenn eine Art und Weise gibt es diese separat für die gleichen Sätze, kursiv und nicht in Klammern bezeichnet zu tun:. Bundesstaat Arkansas v John Doe (aber vielleicht sollte das als eine separate Frage gestellt werden).

Vielen Dank, dass Sie einem Neuling geholfen haben!

+0

Könnten Sie bitte ein Beispiel für Ihre Daten sowie die gewünschte Ausgabe für dieses Beispiel angeben, damit wir sicher sein können, dass wir Ihnen das geben, wonach Sie suchen? – Barker

Antwort

2

Ich glaube, ich habe herausgefunden, was Sie wollen, aber es ist schwer, ohne Beispiel Daten zu erzählen. Ich habe einen Datenrahmen erstellt und mit diesem Beispiel gearbeitet. Wenn es nicht das ist, was Sie anstreben, geben Sie ein Beispiel.

df <- data.frame(text = c("(Roe v. Wade) is not about boats", 
          "(Dred Scott v. Sandford) and (Plessy v. Ferguson) have not stood the test of time", 
          "I am trying to confuse you (this is not a court case)", 
          "this one is also confusing (But with Capital Letters)", 
          "this is confusing (With Capitols and v. d)"), 
       stringsAsFactors = FALSE) 

Der reguläre Ausdruck Ich denke, Sie wollen, ist:

cases <- regmatches(df$text, gregexpr("(?<=\\()([[:upper:]].*? v\\. [[:upper:]].*?)(?=\\))", 
        df$text, perl=T)) 

Sie können dann die Anzahl der Fälle erhalten und es zu einem Datenrahmen hinzufügen, mit:

df$numCases <- vapply(cases, length, numeric(1)) 

Was kursiv Ich würde wirklich ein Beispiel für Ihre Daten benötigen. Normalerweise wird diese Art von Formatierung nicht gespeichert, wenn Sie eine Zeichenfolge in R einlesen, so dass die Kursivschrift tatsächlich nicht mehr existiert.

+0

Entschuldigung für das Fehlen von MWE. Genau das habe ich gesucht, vielen Dank! Funktioniert perfekt. – beddotcom

+0

Kein Problem, Sie haben viel Arbeit mit dem anfänglichen regulären Ausdruck ausgeführt, um die Klammern zu finden. – Barker

+0

Schätzen Sie Ihre Hilfe. Dies funktionierte zunächst gut, aber ich bemerkte, dass bei größeren Datensätzen viel unerwünschtes Material aufgenommen wurde. Avinashs korrigiert das Problem. – beddotcom

2

Ihre Regex ändern wie unten,

regmatches(df$text, gregexpr("(?<=\\()[^()]*\\sv\\.\\s[^()]*(?=\\))", df$text, perl=T))[[1]] 

DEMO

+0

Danke. Dies ist eine enorme Verbesserung gegenüber meiner Regex. Ich wünschte, ich könnte zwei richtige Antworten auswählen. – beddotcom

Verwandte Themen