/ / Unterschiedliches Regex-Verhalten in Python 2.7 und Python 3.5 - Regex, Python-2.7, Python-3.x

Unterschiedliches Regex-Verhalten in Python 2.7 und Python 3.5 - Regex, Python-2.7, Python-3.x

Ich habe ein einfaches Code-Snippet, um ein Zielwort und vorangegangene Wörter zu suchen:

# -*- coding: utf-8 -*-
import re
txt = u"Min bil är trasig. Det är det också förbundet med ett sjukhus"
tag = u"(förbundet)"
pat = u"(?:\w+[ \t,]+){0,2}"+ tag
res = re.finditer(pat,txt,re.IGNORECASE|re.MULTILINE)
for i in res:
print i.group()

Wenn ich diesen Code mit Python 2 ausführe.7, ich bekomme nur das wort "förbundet". Wenn ich denselben Code mit Python 3.5 ausführe, wird "det också förbundet" angezeigt. Dies ist das erwartete Verhalten (bis zu zwei Wörter vor dem Ziel). Was verursacht den Fehler in Python 2.7? Wenn ich im realen Code das Suchmuster definiere, kann ich das Rohtextformat nicht verwenden, da das Suchmuster in einer Schleife definiert ist (das heißt, ich muss manuell entkommen), in der ich eine Liste von Zielwörtern durchsuche und erstelle ein neues Suchmuster für jedes Zielwort.

Antworten:

2 für die Antwort № 1

Sie müssen die re.U / re.UNICODE Flag in Python 2.x, das in Python 3.x standardmäßig aktiviert ist, um die Unicode-Kurzschriftklasse zu aktivieren. Ersetze das re.MULTILINE mit re.U (das re.M Flagge sieht hier überflüssig aus, da es keine gibt ^ und $ in Ihrem Muster).

# -*- coding: utf-8 -*-
import re
txt = u"Min bil är trasig. Det är det också förbundet med ett sjukhus"
tag = u"(förbundet)" pat = ur"(?:w+[ t,]+){0,2}"+ tag
res = re.finditer(pat,txt,re.IGNORECASE|re.U)
for i in res:
print i.group().encode("utf8")

Siehe die Python 2.7.10 Demo.

Beachten Sie, dass Sie durch die Verwendung von Zeichenfolgenliteralen doppelte umgekehrte Schrägstriche in einfache umgekehrte Schrägstriche im Regex-Muster reduzieren können.