web-dev-qa-db-ja.com

N番目の文字ごとに文字列を分割し、異なる区切り文字で結合します

区切り記号の異なる文でテキストの折り返しを使用しようとしています。これはまさに私が出力として取得したいものです:

_'here are third-party[SEPARATOR1]extensions like[SEPARATOR2]Scener that allow us[SEPARATOR3]to watch content.'
_

.join()wrap()を使った最初の試みは失敗しました。

_[In] : 
sentence = '''here are third-party extensions like Scener that allow us to watch content.'''

separator = '[SEPARATOR]'

text = separator.join(wrap(sentence, 20))

[Out] :
'here are third-party[SEPARATOR]extensions like[SEPARATOR]Scener that allow us[SEPARATOR]to watch content.'
_

次に、セパレーター内でforループを試しましたが、成功しませんでした...:

_[In] : 
sentence = '''here are third-party extensions like Scener that allow us to watch content.'''

for i in range(1, 4):
    separator = '[SEPARATOR' + str(i) + ']'

text = separator.join(wrap(sentence, 20))

[Out] :
'here are third-party[SEPARATOR3]extensions like[SEPARATOR3]Scener that allow us[SEPARATOR3]to watch content.'
_

多分.split().join()関数を組み合わせる方が私がやりたいことをするのに良い方法かもしれませんが、私は方法を見つけることができません。これを達成する方法について何か考えがありますか?

4
prog-amateur

ラップは、テキストの反復可能性を提供します。セパレータでイテラブルを作成できる場合は、"".join(t for pair in Zip(wrapped_chunks, separators) for t in pair)でセパレータを結合できます

セパレーターは無限ジェネレーターで作成できます。

_def inf_separators():
    index = 1
    while True:
        yield f"SEPARATOR{index}"
        index = index + 1
_

これにより、1つのセパレータが多すぎるため、セパレータを削除するか、_wrapped_chunks_の最後の項目を特別に追加することができます。

いくつかの異なるセパレータを交互に使用したい場合は、itertools.cycle(["SEP1", "SEP2", "SEP3"])を使用して、トークンの反復サイクルを生成できます。

2
Moberg

これを試して:

from textwrap import wrap

sentence = '''here are third-party extensions like Scener that allow us to watch content.'''

new_sentence = ""
parts = wrap(sentence, 20)
for i, part in enumerate(parts):
    new_sentence += part
    # adding separator after each part except for the last one
    if i < len(parts) - 1:
        new_sentence += f"[SEPARATOR{i+1}]"
print(new_sentence)

# output: here are third-party[SEPARATOR1]extensions like[SEPARATOR2]Scener that allow us[SEPARATOR3]to watch content.

1
Gabip