他とは異なる非正規表現アプローチ:
>>> import string
>>> from itertools import groupby
>>>
>>> special = set(string.punctuation + string.whitespace)
>>> s = "One two three tab\ttabandspace\t end"
>>>
>>> split_combined = [''.join(g) for k, g in groupby(s, lambda c: c in special)]
>>> split_combined
['One', ' ', 'two', ' ', 'three', ' ', 'tab', '\t', 'tabandspace', '\t ', 'end']
>>> split_separated = [''.join(g) for k, g in groupby(s, lambda c: c if c in special else False)]
>>> split_separated
['One', ' ', 'two', ' ', 'three', ' ', 'tab', '\t', 'tabandspace', '\t', ' ', 'end']
の代わりにdict.fromkeys
andを使用できると思います。.get
lambda
[編集]
いくつかの説明:
groupby
iterable と (オプションの) keyfunction の 2 つの引数を受け入れます。iterable をループし、keyfunction の値でグループ化します。
>>> groupby("sentence", lambda c: c in 'nt')
<itertools.groupby object at 0x9805af4>
>>> [(k, list(g)) for k,g in groupby("sentence", lambda c: c in 'nt')]
[(False, ['s', 'e']), (True, ['n', 't']), (False, ['e']), (True, ['n']), (False, ['c', 'e'])]
ここで、keyfunction の値が連続している項がグループ化されます。(実際、これはバグの一般的な原因です。連続していない可能性のある用語をグループ化したい場合、最初に keyfunc でソートする必要があることを人々は忘れています。)
@JonClementsが推測したように、私が考えていたのは
>>> special = dict.fromkeys(string.punctuation + string.whitespace, True)
>>> s = "One two three tab\ttabandspace\t end"
>>> [''.join(g) for k,g in groupby(s, special.get)]
['One', ' ', 'two', ' ', 'three', ' ', 'tab', '\t', 'tabandspace', '\t ', 'end']
セパレーターを組み合わせていた場合。 値が辞書にない場合に.get
返します。None