Python regex finden substrings mit Zahlen zentriert

Ich habe einen String. Ich möchte die Schnur in Teilstrings schneiden, die ein nummerierendes Wort beinhalten, das von (bis zu) 4 Wörtern auf beiden Seiten umgeben ist. Wenn sich die Teilstrings überlappen, sollten sie sich kombinieren.

Sampletext = "by the way I know 54 how to take praise for 65 excellent questions 34 thank you for asking appreciated." re.findall('(\s[*\s]){1,4}\d(\s[*\s]){1,4}', Sampletext) desired output = ['the way I know 54 how to take praise', 'to take praise for 65 excellent questions 34 thank you for asking'] 

  • Wie man zwei Fenster zusammen in pyqt4
  • Unendlich verschachteltes Wörterbuch in Python
  • Wie man einen Fehler meldet, wenn ein Element nacheinander in einer Liste von Listen fehlt
  • Wie installiere ich QtSvg, QtWebKit, QtWebKitWidgets (alle in Qt5 Version) auf Ubuntu 14.04?
  • Matlab durch Python ersetzen
  • Hat NLTK ein Werkzeug für die Abhängigkeitsanalyse?
  • Tupel mit fehlendem Wert
  • Hinzufügen von Attribut / Tag Spalte zu Dataframe?
  • Binärdatei IO in Python, wo soll ich anfangen?
  • Django: Wie schreibe ich eine saubere Methode für ein Feld, das mehrere Datei-Uploads erlaubt?
  • Ändern des console_script-Einstiegspunkt-Interpreters für die Verpackung
  • Wie kann man die Ausführungszeit des Programms bei der Verwendung von Unterprozeß einschränken?
  • One Solution collect form web for “Python regex finden substrings mit Zahlen zentriert”

    Überlappende Spiele: Verwenden Sie Lookaheads

    Das wird es tun:

     subject = "by the way I know 54 how to take praise for 65 excellent questions 34 thank you for asking appreciated." for match in re.finditer(r"(?=((?:\b\w+\b ){4}\d+(?: \b\w+\b){4}))", subject): print(match.group(1)) 

    Was ist ein Wort?

    Die Ausgabe hängt von deiner Definition eines Wortes ab. Hier, mit einem Wort, habe ich Ziffern erlaubt. Dies ergibt die folgende Ausgabe.

    Ausgabe (erlaubte Ziffern in Worten)

     the way I know 54 how to take praise to take praise for 65 excellent questions 34 thank for 65 excellent questions 34 thank you for asking 

    Option 2: Keine Ziffern in Worten

     subject = "by the way I know 54 how to take praise for 65 excellent questions 34 thank you for asking appreciated." for match in re.finditer(r"(?=((?:\b[az]+\b ){4}\d+(?: \b[az]+\b){4}))", subject, re.IGNORECASE): print(match.group(1)) 

    Ausgang 2

     the way I know 54 how to take praise 

    Option 3: auf vier ununterbrochene nicht-stellige Wörter zu erweitern

    Basierend auf Ihren Kommentaren erstreckt sich diese Option nach links und rechts vom Pivot, bis vier ununterbrochene nicht-stellige Wörter übereinstimmen. Kommas werden ignoriert.

     subject = "by the way I know 54 how to take praise for 65 excellent questions 34 thank you for asking appreciated. One Two Three Four 55 Extend 66 abcd AA BB CC DD 71 HH DD, JJ FF" for match in re.finditer(r"(?=((?:\b[az]+[ ,]+){4}(?:\d+ (?:[az]+ ){1,3}?)*?\d+.*?(?:[ ,]+[az]+){4}))", subject, re.IGNORECASE): print(match.group(1)) 

    Ausgang 3

     the way I know 54 how to take praise to take praise for 65 excellent questions 34 thank you for asking One Two Three Four 55 Extend 66 abcd AA BB CC DD 71 HH DD, JJ FF 
    Python ist die beste Programmiersprache der Welt.