pythonには、リストではなくイテレータを生成する文字列の分割を行うためのビルドイン(標準ライブラリの意味)がありますか?私は非常に長い文字列を扱い、文字列のほとんどを消費する必要がないことを心に留めています。イテレータに文字列を分割する
答えて
re
モジュールはre.finditer()
(対応する正規表現にはfinditer()
メソッドがあります)という文字列を直接分割しません。
>>> import re
>>> s = "The quick brown\nfox"
>>> for m in re.finditer('\S+', s):
... print(m.span(), m.group(0))
...
(0, 3) The
(4, 9) quick
(13, 18) brown
(19, 22) fox
s.Lottと同じように、私は非常にあなたがしたいのか分かりません。
s = "This is a string."
for character in s:
print character
for word in s.split(' '):
print word
次の文字を見つけるためのs.index()とs.find()もあります。
後で、このようなものです。
>>> def tokenizer(s, c):
... i = 0
... while True:
... try:
... j = s.index(c, i)
... except ValueError:
... yield s[i:]
... return
... yield s[i:j]
... i = j + 1
...
>>> for w in tokenizer(s, ' '):
... print w
...
This
is
a
string.
コメントの説明を参照してください。これは質問に答えません。 – marcog
彼は明示的に*組み込みを依頼しています* –
@ 7vies:これは「いいえ」と言ったり、「正規表現を使用してください(上記の答え)」というよりも優れていると思いました。 – hughdbrown
あなたは(標準ライブラリからインポート可能なされていないが、Pythonの分布自体に吸収された)SPARKのようなものを使用することができますが、最終的にそれは同様に正規表現を使用していますので、Duncan's answerは、おそらく同じようにあなたも役立つであろう空白に分割するのと同じくらい簡単だったのであれば。
もうひとつ、もっと難しいオプションは、あなたが実際にスピードを望んでいれば、自分のPythonモジュールをC言語で書くことですが、これはもちろん、時間のかかる投資です。
文字列全体を消費する必要がない場合は、具体的なものを探しているからです。次に、分割するのではなく、re
または.find()
で探してください。そうすれば、興味のある文字列の部分を見つけて分割することができます。
私が気づいていたアプリケーションでは、空白に分割し、それに応じて3番目の部分文字列をチェックし、4番目または6番目の部分文字列をチェックして残りの文字列を処理したいと考えました。 –
@ pythonic metaphor:そうですね、文字列が本当に長くても、 're'や' find'を使いたいかもしれません。それ以外の場合は、空白で分割してください。私は分かりませんが、あなたの質問は早すぎる最適化のように聞こえます。 ;)だからあなたは確かめるためにそれをプロファイルする必要があります。 –
@pythonic metaphor:早すぎる最適化である通常のテキストの場合。テキストは10MB以上の "大"になり始めます。あなたが記述したアプリケーションでは、 'text.split(None、6)'を使って最初の6単語を取得します。とにかくテキスト全体を分割する必要がある場合は、すぐにそれを実行してください。 –
itertools
をご覧ください。 takewhile
、islice
およびgroupby
のようなものが含まれています。これは、イテラブル(文字列は反復可能)を、インデックスまたはブール値のソート条件に基づいて別のイテレートにスライスすることを可能にします。
str.split
というイテレータベースのアナログは組み込まれていません。あなたのニーズに応じて、あなたは、リスト反復子を作ることができる:
iterator = iter("abcdcba".split("b"))
iterator
# <list_iterator at 0x49159b0>
next(iterator)
# 'a'
しかし、このサードパーティのライブラリからツールはおそらく、あなたが望むものmore_itertools.split_at
を提供しています。例については、this postも参照してください。
- 1. 文字列を部分文字列に分割するc
- 2. 文字列をiOSの部分文字列に分割する
- 3. 分割文字列
- 4. 分割文字列
- 5. 分割文字列
- 6. 分割文字列[]
- 7. 分割文字列
- 8. 文字列メッセージを文字で10文字に分割する
- 9. 文字列をオブジェクトフィールドに分割する
- 10. 文字列を行に分割する
- 11. 分割文字列に "。"
- 12. 文字列を整数と文字列に分割するC++
- 13. 文字列をJavaの文字列とintに分割する
- 14. テキストファイルから文字列を文字列に分割する
- 15. 文字列を配列に分割する(各文字) - Swift
- 16. 文字列を文字列に分割する
- 17. 文字列を文字列に分割する
- 18. 文字列に基づいて文字列を分割する
- 19. 文字配列を文字列に分割する
- 20. 文字列を文字配列に分割する - Objective-C
- 21. 文字列ビルダーを文字列に分割する
- 22. Knockoutjs:文字列を文字列に分割する
- 23. 文字列配列の文字列を分割して区切り文字を分割する
- 24. 文字列の配列から文字列を分割する
- 25. Regex - グループに分割する文字列
- 26. 文字列を連続する部分文字列に分割しますか?
- 27. 文字列を部分に分割する方法 - ローマ数字
- 28. 文字列を文字列に分割しますか?
- 29. 文字列を文字列で分割するときのエラー
- 30. 文字列を分割する別の文字列
"ほとんどの文字列を消費する必要はありません"これは何を意味するのでしょうか?文字列オブジェクトはすべてメモリ内にあります。すべてがメモリ内にあり、すでにシーケンスであるため、文字を繰り返し処理する必要はありません。 「文字列の大部分を消費する必要はありません」という意味を定義してください。 –
はい、文字列はすでにメモリに入っています。しかし、スプリットする場所を特定するため、またはスプリットの結果として部分文字列を作成するために、文字列全体をトラバースする必要はありません。 –
おそらく、イテレータを提供するある種のトークナイザまたはスキャナが必要です。下の正規表現の解答はうまくいくかもしれません。 –