2016-06-08 6 views
1

zurück Darunter ist der Satz, den ich verarbeiten möchte. Es besteht aus IDs, die mit zwei Hashes an der Vorderseite beginnen (##2312435) plus restlichen Text. Ich brauche einen regulären Ausdruck, der Sätze mit dem Wort likely darin finden würde und den ganzen Satz plus die ID abrufen würde.Python Regex: geben Sie den ganzen Satz mit einem bestimmten Wort von Zeitraum bis Punkt

Satz:

## 2312435 Jon ist nicht zu Hause. John wird wahrscheinlich nach Mitternacht nach Hause kommen. Ein anderer nicht verwandter Satz. ## 2233442 Mark ist sehr wütend. Mark wird wahrscheinlich heute Abend ein Bier trinken.

ich es geschafft, dies zu schreiben:

(?=.\*((?<=##)\d+))(?=.*([^.]+(likely)+[^.]+)) 

aber, dass die volle Satz nicht abrufen.

Erwartetes Ergebnis aussehen würde: 2312435 John ist wahrscheinlich nach Hause nach Mitternacht kommen, ist 2.233.442 Mark wahrscheinlich ein Bier heute Abend haben

ich dies frage nur für Allgemeinwissen, weil ich in den Griff zu bekommen habe Schwierigkeiten mit Aussichtspunkten. Ich habe das schon ohne Regex gelöst, aber ich dachte mir, ich könnte es versuchen und die benötigten Informationen mit Regex abrufen. Dank

+0

Sie erkennen, dass Sie Regex für das Ganze nicht brauchen? – glls

+0

Ja, ich weiß, ich habe es schon ohne sie gemacht, aber ich wollte eine Praxis mit Regex haben und konnte diese nicht lösen. – Rkey

+1

Ok.Vielleicht möchtest du das in deinem Beitrag hinzufügen und füge bitte das hinzu, was deine Regex erwartet (Beispiel) – glls

Antwort

2

So ist es sehr hässlich, und funktioniert nur im Fall, wenn nur ein Satz mit Wort likely:

re.findall(r'##(\d+)(?:[^#]*\.)*([^#.]*?likely[^#.]*?)\.', text, re.IGNORECASE) 

# Output: 
#[('2312435', ' John is likely to come home after midnight'), 
# ('2233442', ' Mark is likely to have a beer tonight')] 
0
p = re.compile(r'^##\d+.*likely.*$') 
res = p.match(t).group().replace('##','') 

Zum Beispiel

>>> t = '##2312435 Jon is not home. John is likely to come home after midnight. Another not related sentence. ##2233442 Mark is very angry. Mark is likely to have a beer tonight.' 
>>> p = re.compile(r'^##\d+.*likely.*$') 
>>> res = p.match(t).group().replace('##','') 
>>> print res 
2312435 Jon is not home. John is likely to come home after midnight. Another not related sentence. 2233442 Mark is very angry. Mark is likely to have a beer tonight. 
0

Jede Regex für diese Aufgabe wird hässlich aussehen, aber wir können es zumindest effizient machen.

Die grundlegende Regex ist die ## + Ziffern entsprechen, diese Ziffern zu erfassen, dann einen beliebigen Text übereinstimmen, die nicht ## + Ziffer ist, dann likely, dann wieder einen beliebigen Text, der nicht ## + Ziffer ist.

##(\d+)\s*((?:(?!##\d).)*\blikely\b(?:(?!##\d).)*) 

Siehe die regex demo. Die (?:(?!##\d).)* ist eine temperierte gierige Marke, die für die Regex-Engine ziemlich schwer ist.

Wir können es entrollen zu erhöhen Leistung wie:

##(\d+)\s*([^#]*(?:#(?!#\d)[^#]*)*\blikely\b[^#]*(?:#(?!#\d)[^#]*)*) 

Siehe another demo

Diese noch nicht so effizient ist, und wenn Sie brauchen, um ein ganzes Wort nicht zu überprüfen likely, können Sie

##(\d+)\s*([^#l]*(?:#(?!#\d)[^l#]*|l(?!ikely)[^l#]*)*likely[^#]*(?:#(?!#\d)[^#]*)*) 

Siehe noch another regex.

Verwandte Themen