Python-Split-String basierend auf Regex

113

Was ist der beste Weg, um einen String "HELLO there HOW are YOU"nach Großbuchstaben zu teilen (in Python)?

Am Ende hätte ich also ein Array wie das folgende: results = ['HELLO there', 'HOW are', 'YOU']


BEARBEITEN:

Ich habe versucht:

p = re.compile("\b[A-Z]{2,}\b")
print p.split(page_text)

Es scheint jedoch nicht zu funktionieren.

Toto
quelle
2
Was hast du versucht ? - Sie konnten nicht finden re.split()?
Gareth Latty
5
Wenn Sie sagen, dass etwas nicht funktioniert, sollten Sie erklären, warum. Bekommst du eine Ausnahme? (Wenn ja, posten Sie die gesamte Ausnahme.) Erhalten Sie die falsche Ausgabe?
Gareth Latty

Antworten:

134

Ich schlage vor

l = re.compile("(?<!^)\s+(?=[A-Z])(?!.\s)").split(s)

Überprüfen Sie diese Demo .

Ωmega
quelle
5
Was passiert, wenn Sie Compile nicht verwenden?
Feelsbadman
3
In den Dokumenten sind "die meisten Operationen mit regulären Ausdrücken als Funktionen auf Modulebene und als RegexObject-Methoden verfügbar. Bei den Funktionen handelt es sich um Verknüpfungen, bei denen Sie nicht zuerst ein Regex-Objekt kompilieren müssen, sondern einige Feinabstimmungsparameter übersehen müssen. " Sie können verwenden re.split(re.split(pattern, string, maxsplit=0, flags=0))wie in den zuvor zitierten Dokumenten erwähnt.
ZaydH
56

Sie könnten einen Lookahead verwenden:

re.split(r'[ ](?=[A-Z]+\b)', input)

Dies wird an jeder Stelle aufgeteilt, auf die eine Folge von Großbuchstaben folgt, die in einer Wortgrenze enden.

Beachten Sie, dass die eckigen Klammern nur zur besseren Lesbarkeit dienen und auch weggelassen werden können.

Wenn es ausreicht, dass der erste Buchstabe eines Wortes in Großbuchstaben geschrieben ist (wenn Sie also auch vor teilen möchten Hello), wird es noch einfacher:

re.split(r'[ ](?=[A-Z])', input)

Dies teilt sich nun an jeder Stelle, gefolgt von einem Großbuchstaben.

Martin Ender
quelle
1
Wie würde ich mich ändern re.split(r'[ ](?=[A-Z]+\b)', input), damit keine Großbuchstaben gefunden werden? ZB würde es nicht mit "A" übereinstimmen? Ich habe es versucht re.split(r'[ ](?=[A-Z]{2,}+\b)', input). Vielen Dank!
@JamesEggers Du meinst, du möchtest mindestens zwei Großbuchstaben benötigen, damit du dich nicht bei Wörtern wie I? re.split(r'[ ](?=[A-Z]{2,}\b)', input)Sollte es tun.
Martin Ender
2
Ich würde zumindest [ ]+oder vielleicht sogar vorschlagen \W+, etwas mehr Fälle zu fangen. Trotzdem eine gute Antwort.
georg
Ich habe den gleichen Ansatz versucht. Ein zu haben [ ]hat bei mir jedoch nicht funktioniert. Stattdessen habe ich verwendet \s. Der vollständige reguläre Ausdruck, der für mich funktioniert hat, warre.split("\s(?=[A-Z]+\s)", string)
h3xh4wk
0

Ihre Frage enthält das String-Literal "\b[A-Z]{2,}\b", aber das \bbedeutet Rücktaste, da es keinen R-Modifikator gibt.

Versuchen Sie : r"\b[A-Z]{2,}\b".

druid62
quelle