2016-08-13 5 views
0

Ich mag den Text zwischen extrahieren "one" und "two" und zwischen "two" und "drei" in der Zeichenfolge s1„one: bla 1 zwei: bla2 drei: bla3 ". Jedoch "zwei: bla2" ist nicht unbedingt in der Zeichenfolge s2. Also wenn es s2ist "eins: bla 1 drei: bla3" sollte es auch funktionieren.Wie extrahiert man Text mit regulären Ausdrücken mit optionalen Mustern?

Ich habe mit dem folgenden R-Kodex kommen, aber mein Versuch, mit den zusätzlichen Klammern um die „zwei: ...“ und das Fragezeichen nicht funktioniert:

library(gsubfn) 
s1 <- "one: bla 1 two: bla2 three: bla3" 
s2 <- "one: bla 1 three: bla3" 
strapplyc(s1, "one: (.*) (two: (.*))? three: (.*)") 
strapplyc(s2, "one: (.*) (two: (.*))? three: (.*)") 
+1

Was gerade Aufspaltung auf '\ w * (ein | zwei | drei): \ w *'? –

+0

Wenn zwei nicht vorhanden sind, dann benötigt Ihr regulärer Ausdruck, dass es zwei Leerzeichen vor drei gibt, aber es gibt nur ein Leerzeichen vor dreien in s2. Versuchen Sie also, das zweite Leerzeichen innerhalb des Parens zu setzen. wirkt auch darauf: 'strapplyc (s2," eins: (. *) (zwei: (. *))? drei: (bla3) ")' –

+0

@ G.Grothiedieck scheint dein Vorschlag für s2 zu funktionieren, aber nicht für s1. – tover

Antwort

2

Vielleicht ist das Problem, dass die .* nach der one: auch den two: Teil und den Text danach verbraucht. So zum Beispiel die die passenden Gruppen in Ihrer Linie würden

1: "bla 1 two: bla2" 
2: [empty] 
3: "bla3" 

Sie sich dieses Problem beheben könnten der erste Stern nicht gierige mit einem Fragezeichen, indem sie.

Einige andere Punkte: Ich denke, Ihnen den Raum innerhalb der Klammern im two: Teil setzen sollte, sonst, wenn es nicht verfügbar ist, wird es zwei Räume zwischen dem one: und two: Teil sein.

Zusätzlich können Sie die Klammern um den optionalen Teil, der nicht erfasst wird, mit ?: erstellen. Sie möchten nur drei Dinge erfassen, und die Klammern um den two: Teil sind nur für den Vorrang, also ist es nicht notwendig zu erfassen.

So insgesamt würden Sie etwas davon haben:

strapplyc(s1, "one: (.*?)(?: two: (.*))? three: (bla3)") 
+0

Das funktioniert. Vielen Dank! – tover

Verwandte Themen