私はいくつかのテキスト処理を実行するための単純なPythonプログラムを書いています。 sedを使って演劇/舞台演劇のテキストを入力として使って文を行に分割したいと思います。 sedを使って書いてみましたが失敗しました。 sedでできるか知りたいです。
import re
test_txt = """
Brigitte:
Ich hoffe, du hast während des Lockdowns nicht alle Benimmregeln vergessen.
Bernd:
Entschuldige bitte. Das muss an der Vorfreude liegen. Endlich wieder kann ich meinen
Cappuccino im Sitzen genießen und muss ihn nicht heimlich aus einem Pappbecher in
irgendeiner Nische in der Fußgängerzone trinken. Wie nervig das war, Maske runter,
einen Schluck trinken, Maske wieder auf, und immer die Gegend im Blick haben, damit ich
die Leute vom Ordnungsamt rechtzeitig sehe.
Brigitte:
Das ist mal wieder typisch. Du denkst nur an dich und lässt dabei das Wesentliche aus
den Augen.
Bernd:
Häh?
(Fesnik erscheint, bringt die Karten)
Fesnik:
Herzlich willkommen im Adria, schön, dass sie bei uns sind.
Bernd:
Ich habe Ihren Cappuccino wirklich vermisst.
Brigitte:
Wir hatten schon Angst, dass Sie nicht wieder aufmachen.
Fesnik:
Eine unbegründete Sorge, Signorina.
(Fesnik ab, Bernd und Brigitte studieren die Karten)
Brigitte:
Signorina heißt Fräulein, wusstest du das eigentlich? Typisch Italiener, schleimen uns
"""
actor_pattern = '.+:'
lines = test_txt.splitlines()
speech = ''
i = 0
while i < len(lines):
if re.match(actor_pattern, lines[i]):
while True:
speech += lines[i].replace('\n', ' ').replace(
'. ', '.\n').replace(
'? ', '?\n').replace(
'! ', '!\n').replace(
') ', ')\n')
i += 1
if not i < len(lines):
break
if re.match(actor_pattern, lines[i]):
print('')
break
else:
i += 1
print(speech, end='')
speech = ''
print('\nEND')
出力は次のとおりです。
Brigitte:Ich hoffe, du hast während des Lockdowns nicht alle Benimmregeln vergessen.
Bernd:Entschuldige bitte.
Das muss an der Vorfreude liegen.
Endlich wieder kann ich meinenCappuccino im Sitzen genießen und muss ihn nicht heimlich aus einem Pappbecher inirgendeiner Nische in der Fußgängerzone trinken.
Wie nervig das war, Maske runter,einen Schluck trinken, Maske wieder auf, und immer die Gegend im Blick haben, damit ichdie Leute vom Ordnungsamt rechtzeitig sehe.
Brigitte:Das ist mal wieder typisch.
Du denkst nur an dich und lässt dabei das Wesentliche ausden Augen.
Bernd:Häh?(Fesnik erscheint, bringt die Karten)
Fesnik:Herzlich willkommen im Adria, schön, dass sie bei uns sind.
Bernd:Ich habe Ihren Cappuccino wirklich vermisst.
Brigitte:Wir hatten schon Angst, dass Sie nicht wieder aufmachen.
Fesnik:Eine unbegründete Sorge, Signorina.(Fesnik ab, Bernd und Brigitte studieren die Karten)
Brigitte:Signorina heißt Fräulein, wusstest du das eigentlich?
Typisch Italiener, schleimen uns
END
コードは、actor_patternを見つけて次の行にリンクし、別のactor_patternが見つかるまで各文を新しい行に分割し、このようにして行を続行します。
答え1
「actor_pattern」が何なのか、使い方が何なのかよくわかりません。この簡単なことはどのくらい行くことができますかsed
?必要な結果に非常に近いですが、いくつかの改善が必要な場合があります。
sed -Ez 's/\n/ /g; s/([.?!)]) ([^(])/\1\n\2/g' file
Brigitte: Ich hoffe, du hast während des Lockdowns nicht alle Benimmregeln vergessen.
Bernd: Entschuldige bitte.
Das muss an der Vorfreude liegen.
Endlich wieder kann ich meinen Cappuccino im Sitzen genießen und muss ihn nicht heimlich aus einem Pappbecher in irgendeiner Nische in der Fußgängerzone trinken.
Wie nervig das war, Maske runter, einen Schluck trinken, Maske wieder auf, und immer die Gegend im Blick haben, damit ich die Leute vom Ordnungsamt rechtzeitig sehe.
Brigitte: Das ist mal wieder typisch.
Du denkst nur an dich und lässt dabei das Wesentliche aus den Augen.
Bernd: Häh? (Fesnik erscheint, bringt die Karten)
Fesnik: Herzlich willkommen im Adria, schön, dass sie bei uns sind.
Bernd: Ich habe Ihren Cappuccino wirklich vermisst.
Brigitte: Wir hatten schon Angst, dass Sie nicht wieder aufmachen.
Fesnik: Eine unbegründete Sorge, Signorina. (Fesnik ab, Bernd und Brigitte studieren die Karten)
Brigitte: Signorina heißt Fräulein, wusstest du das eigentlich?
Typisch Italiener, schleimen uns
sed
バージョンは(GNU sed)4.7です。スクリプトはこの-z
オプション(一部のバージョンでは使用できません)を使用してテキスト全体をメモリに読み込み、すべての<NL>
文字を空白に置き換えて1つの長い行を形成し、すべての<NL>
文末尾の文字の後に文字を追加します。