2011-01-03 9 views
22

pythonには、リストではなくイテレータを生成する文字列の分割を行うためのビルドイン(標準ライブラリの意味)がありますか?私は非常に長い文字列を扱い、文字列のほとんどを消費する必要がないことを心に留めています。イテレータに文字列を分割する

+2

"ほとんどの文字列を消費する必要はありません"これは何を意味するのでしょうか?文字列オブジェクトはすべてメモリ内にあります。すべてがメモリ内にあり、すでにシーケンスであるため、文字を繰り返し処理する必要はありません。 「文字列の大部分を消費する必要はありません」という意味を定義してください。 –

+0

はい、文字列はすでにメモリに入っています。しかし、スプリットする場所を特定するため、またはスプリットの結果として部分文字列を作成するために、文字列全体をトラバースする必要はありません。 –

+1

おそらく、イテレータを提供するある種のトークナイザまたはスキャナが必要です。下の正規表現の解答はうまくいくかもしれません。 –

答えて

15

reモジュールはre.finditer()(対応する正規表現にはfinditer()メソッドがあります)という文字列を直接分割しません。

は@Zeroは、例えば尋ねた:

>>> 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 
+2

're.finditer()'を使って分割文字列を反復する方法の例が参考になります。 – Zero

+1

@Zero、厳密に厳密ではないが、ここに行く。 – Duncan

5

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. 
+1

コメントの説明を参照してください。これは質問に答えません。 – marcog

+0

彼は明示的に*組み込みを依頼しています* –

+3

@ 7vies:これは「いいえ」と言ったり、「正規表現を使用してください(上記の答え)」というよりも優れていると思いました。 – hughdbrown

0

あなたは(標準ライブラリからインポート可能なされていないが、Pythonの分布自体に吸収された)SPARKのようなものを使用することができますが、最終的にそれは同様に正規表現を使用していますので、Duncan's answerは、おそらく同じようにあなたも役立つであろう空白に分割するのと同じくらい簡単だったのであれば。

もうひとつ、もっと難しいオプションは、あなたが実際にスピードを望んでいれば、自分のPythonモジュールをC言語で書くことですが、これはもちろん、時間のかかる投資です。

3

文字列全体を消費する必要がない場合は、具体的なものを探しているからです。次に、分割するのではなく、reまたは.find()で探してください。そうすれば、興味のある文字列の部分を見つけて分割することができます。

+0

私が気づいていたアプリケーションでは、空白に分割し、それに応じて3番目の部分文字列をチェックし、4番目または6番目の部分文字列をチェックして残りの文字列を処理したいと考えました。 –

+2

@ pythonic metaphor:そうですね、文字列が本当に長くても、 're'や' find'を使いたいかもしれません。それ以外の場合は、空白で分割してください。私は分かりませんが、あなたの質問は早すぎる最適化のように聞こえます。 ;)だからあなたは確かめるためにそれをプロファイルする必要があります。 –

+3

@pythonic metaphor:早すぎる最適化である通常のテキストの場合。テキストは10MB以上の "大"になり始めます。あなたが記述したアプリケーションでは、 'text.split(None、6)'を使って最初の6単語を取得します。とにかくテキスト全体を分割する必要がある場合は、すぐにそれを実行してください。 –

0

itertoolsをご覧ください。 takewhileisliceおよびgroupbyのようなものが含まれています。これは、イテラブル(文字列は反復可能)を、インデックスまたはブール値のソート条件に基づいて別のイテレートにスライスすることを可能にします。

0

str.splitというイテレータベースのアナログは組み込まれていません。あなたのニーズに応じて、あなたは、リスト反復子を作ることができる:

iterator = iter("abcdcba".split("b")) 
iterator 
# <list_iterator at 0x49159b0> 
next(iterator) 
# 'a' 

しかし、このサードパーティのライブラリからツールはおそらく、あなたが望むものmore_itertools.split_atを提供しています。例については、this postも参照してください。

関連する問題