2011-06-30 20 views
3

私はre.split()を使って文字列をトークンに分割しています。現在、引数として使用しているパターンは[^\dA-Za-z]で、文字列から英数字のトークンを取得します。Pythonで数字/文字トークンを区切ります

しかし、私が必要とするのは、数値と文字の両方をトークンに分割することです。

re.split(pattern, "my t0kens") 

は、["my", "t", "0", "kens"]を返します。

私はlookahead/lookbehindを使う必要があるかもしれないと思っていますが、それが実際に必要か、それとももっと良い方法があるか分かりません。

答えて

7

代わりにfindallメソッドを試してください。

編集:以下のBartのコメントからの改善。パターン内に捕捉括弧を使用することにより

>>> print re.findall('[a-zA-Z]+|\\d+', "my t0kens") 
['my', 't', '0', 'kens'] 
>>> 
+6

はあなたの2つの提案の組み合わせに絞ることができ、コードの1行にしなければなりません: '印刷re.findall( '[a-zA-Z]の+ | \\ D +'「、私の"['my'、 't'、 '0'、 'kens']' –

+0

@Bart - これははるかに優れています! – kjp

+1

バートの編集では、これは私の答えよりもはるかに優れています。 +1 –

0

ない完璧な、しかし下記のリストからスペースを削除すると

re.split('([\d ])', 'my t0kens') 
['my', ' ', 't', '0', 'kens'] 

docs :-)簡単です。「パターンの出現により、分割文字列キャプチャ括弧はパターンで使用されている場合は、すべての後、テキストパターン内のグループも結果のリストの一部として返されます。

2
>>> [x for x in re.split(r'\s+|(\d+)',"my t0kens") if x] 
['my', 't', '0', 'kens'] 

、トークンはまた、リターンとなります。空白ではなく数字だけを維持したいので、私は\sを括弧の外側に残しました。したがって、Noneが返され、単純なループを使用してフィルタリングすることができます。

+0

これは、検索される1桁の数字しかない場合に機能します。一般的なケースでは、複数の場合があります。 – caroline

+0

これは簡単に修正できます。回答が更新されました。もちろん、kjpの答えの解はまだまだエレガントです。その代わりに使用してください。 –

1

re.findall('[a-z]+|[\d]+', 'my t0kens') 
+0

小文字のみ? –

関連する問題