/ / Rozdziel ciągi na podstawie wielu ograniczników jednocześnie zachowując je - python, string, split, whitespace, sentence

Podziel ciągi na podstawie wielu ograniczników, jednocześnie zachowując je - python, string, split, whitespace, sentence

Wprowadzam 5 zdań i muszę je podzielić przy użyciu wielu ograniczników (, /! /?)

Niestety podczas pisania kodu rozważałem tylko litery i umieszczałem te ograniczniki i użyłem .split (). Wszystko działało dobrze.

to był kod:

final_text = ""
split_one = ""
input_text = input("Enter the data: ")
count_d = input_text.count("!") + input_text.count("?") + input_text.count(".")

if count_d == 5:
final_text = input_text
final_text = final_text.replace("!", "! ").replace("?", "? ").replace(".", ". ")
split_one = final_text.split()
i = 0
while True:
print(split_one[i])
i += 1
if i == 5:
break

Dla danych wejściowych: a.b? C! D.f!

The output was
a.
b?
c!
d.
f!

Ale ja w rzeczywistości wprowadzam zdania, a nie litery. Na przykład

hi.how are you? I am good! what about you?bye!

To daje mi:

 hi.
how
are
you?
I

Zamiast

hi.
how are you?
I am good!
what about you?
bye!

Co mogę zrobić, aby uniknąć podziału ze względu na białe przestrzenie i uzyskać je tylko dla ograniczników? (, /. /!)

PS: Nie używam żadnych zewnętrznych pakietów. Wersja to 3.6

Odpowiedzi:

2 dla odpowiedzi № 1

Możesz użyć itertools.groupby podzielić ciąg znaków przez interpunkcję, np .:

>>> import itertools as it
>>> s = "hi.how are you? I am good! what about you?bye!"
>>> r = ["".join(v).strip() for k, v in it.groupby(s, lambda c: c in ".!?")]
>>> r
["hi", ".", "how are you", "?", "I am good", "!", "what about you", "?", "bye", "!"]
>>> for sentence, punct in zip(*[iter(r)]*2):
...     print(sentence + punct)
hi.
how are you?
I am good!
what about you?
bye!

Jeśli nie zależy Ci na interpunkcji, możesz użyć:

>>> ["".join(v).strip() for k, v in it.groupby(s, lambda c: c in ".!?") if not k]
["hi", "how are you", "I am good", "what about you", "bye"]