2017-07-18 1 views
2

Ich bin ziemlich neu bei Regex, und ich versuche, Text zwischen zwei Zeichenfolgen zu erfassen. Aber wenn die Zeichenfolgen nicht existieren, möchte ich den gesamten Text erfassen. HierRegex - erfassen Sie Text zwischen den Übereinstimmungen, und wenn keine Übereinstimmung, erfassen alle

ein Beispiel:

Report # 1: Bemerkungen: Eine Katze streckt. Schlussfolgerungen: Diese Katze ist flexibel.

Und ich kann den folgenden Code verwenden, den Text zwischen "Beobachtungen" zu erfassen und "Schlussfolgerungen":

(?:(?i)observations)(.*)(?:(?i)conclusions) 

Aber wenn ein anderer Text schreibt:

Report # 1 : Beobachtungen: Eine Katze streckt sich. Diese Katze ist flexibel.

Ich möchte alles nach "Beobachtungen" erfassen.

Oder wenn die Startfolge "Beobachtungen" existiert nicht:

Report # 1: Eine Katze streckt. Schlussfolgerungen: Diese Katze ist flexibel.

Ich möchte von Anfang an der Endung Zeichenfolge erfassen „Schlussfolgerungen“.

Ich denke, bedingte Regex kann helfen?

Danke!

+0

Arbeiten Sie in R? –

+0

Sie könnten versuchen, https://regex101.com/r/RdMnFA/1 –

+0

@WiktorStribizew Ja, ich bin. Wow Danke! es sieht ordentlich aus. Ich denke, es muss so lange dauern, bis der Conditional funktioniert? – TZschu

Antwort

0

Ein Einzeiler:

ex <- c(
    "Report #1: Observations: A cat is stretching. Conclusions: This cat is flexible.", 
    "Report #1: Observations: A cat is stretching. This cat is flexible.", 
    "Report #1: A cat is stretching. Conclusions: This cat is flexible." 
) 

gsub("(^.*observations|conclusions.*$)", "", ex, ignore.case = TRUE) 
# [1] ": A cat is stretching. "      
# [2] ": A cat is stretching. This cat is flexible." 
# [3] "Report #1: A cat is stretching. "    

Sie könnten Grenzen wollen oder als G5W vor Räume vorgeschlagen/nach den Worten. Wortgrenzen würden so aussehen, mit der gleichen Ausgabe, die den Beispieltext gegeben ist:

gsub("(^.*\\bobservations\\b|\\bconclusions\\b.*$)", "", ex, ignore.case = TRUE) 
+0

Danke! Dies ist perfekt! – TZschu

1

Ein Weg, dies zu tun, ist mit zwei regulären Ausdrücken:

reports = c(
"Report #1: Observations: A cat is stretching. Conclusions: This cat is flexible.", 
"Report #1: Observations: A cat is stretching. This cat is flexible.") 

reports = sub(".*Observations:\\s*", "", reports) 
reports = sub("\\s*Conclusions:.*", "", reports) 

reports 
[1] "A cat is stretching."      
[2] "A cat is stretching. This cat is flexible." 
+0

Irgendwelche Gründe für die Erwartung von Leerraum? Ich glaube nicht, dass das eine Voraussetzung war. – r2evans

+0

In den Beispieldaten ist Leerraum vorhanden. – G5W

+0

Ja, aber nicht in der Voraussetzung für das Parsen. Ich denke nicht, dass es inhaltlich falsch ist, aber das OP hat keine Leerzeichen angegeben. Ich denke, eine bessere Erwartung wäre die Grenze '\\ b'. – r2evans

Verwandte Themen