2016-07-14 4 views
0

Ich brauche Hilfe mit einer Regex, die die ersten beiden Wörter am Anfang findet dann nimmt nur die ersten beiden Sätze nach, trotz wie viele Instanzen im Text auftreten.Need Regex nur die ersten beiden Sätze zu nehmen, auch wenn andere Instanzen auftreten

text = "The Smithsonian museum is home to a variety of different art displays. According various reports art appreciation is on the rise. Blah blah blah blah. The Smithsonian museum blah blah blah. Blah blah blah blah." 

Mein Code sieht in etwa wie folgt aus:

(re.findall(r"""((The Smithsonian|The Metropolitan)[^\.]*\.[^\.]*\.)""", text)) 

Dies ist jedoch mehrere Instanzen und nicht nur die ersten beiden Sätze zurückkehrt, und oft gibt es Müll wie „The Smithsonian,“ am Ende . Können Sie bitte helfen? Vielen Dank!

+0

Vielleicht einen Anker verwenden? '^ (The Smithsonian | The Metropolitan) [^.] * \. [^.] * \.' – 4castle

+0

Müssen Sie Wörter wie "Mr." berücksichtigen? oder "Frau"? – Erutan409

Antwort

0

Versuchen Sie folgendes:

^(The Smithsonian|The Metropolitan).+?(?>\.).+?(?>\.)

0

Ich bin nicht Python Entwickler, aber das Problem scheint, dass Sie findall verwenden, so soweit ich weiß, kann man finditer (und Suche verwenden die erste Iteration) oder search, um nur einmal Match-Objekt zu finden.

Wenn Sie jedoch findall verwenden möchten, dann können Sie den ^ Anker zu Ihrer regex hinzufügen:

^((The Smithsonian|The Metropolitan)[^\.]*\.[^\.]*\.) 

regex demo

0

Mit diesem regex, Sie müssen nicht zu hart Code jede Anfangsphrase für die Sätze. Es entspricht genau 2 Vorkommen eines Satzes gefolgt von den Leerzeichen vor dem nächsten Satz.

^((?:\w+(?:\s|\.))+\s+){2} 

Hier ist die Testverbindung für sie: https://regex101.com/r/mJ4oR7/2

Dies wird vorausgesetzt, es innerhalb der string keine Sonderzeichen sind.

+0

Das sieht nach etwas aus, das nützlich wäre, aber ich muss nur die Sätze mit diesen Qualifiern aufnehmen. Wie würde ich diesen Code mit den ersten beiden Qualifiern implementieren? Ich habe es selbst versucht, habe aber ein paar Probleme, danke! – staten12

0

Wenn Sie "The Smithsonian" usw. aus dem Ergebnis, verwenden (?:) in der zweiten Gruppe ausschließen möchten:

((?:The Smithsonian|The Metropolitan)[^\.]*\.[^\.]*\.) 

Jetzt ist Ihre Gruppe 0 sollte nur zurückgeben, die Sätze.

>>> x = "The Smithsonian museum is home to a variety of different art displays. According various reports art appreciation is on the rise. Blah blah blah blah. The Smithsonian museum blah blah blah. Blah blah blah blah." 
>>> y = re.findall(r"""((?:The Smithsonian|The Metropolitan)[^\.]*\.[^\.]*\.)""", text) 
>>> y[0] 
'The Smithsonian museum is home to a variety of different art displays. According various reports art appreciation is on the rise.' 

Siehe auch What is a non-capturing group? What does a question mark followed by a colon (?:) mean?.

Verwandte Themen