İşte benim uygulamam, buradaki diğer cevaplardan çok, çok daha hızlı ve daha eksiksiz. Farklı durumlar için 4 ayrı alt işlevi vardır.
Sadece ana str_splitişlevin dokümantasyonunu kopyalayacağım :
str_split(s, *delims, empty=None)
sDizeyi argümanların geri kalanına bölün , muhtemelen boş kısımları atlayın ( emptyanahtar kelime argümanı bundan sorumludur). Bu bir jeneratör işlevidir.
Yalnızca bir sınırlayıcı sağlandığında, dize basitçe onunla bölünür.
emptydaha sonra Truevarsayılan olarak.
str_split('[]aaa[][]bb[c', '[]')
-> '', 'aaa', '', 'bb[c'
str_split('[]aaa[][]bb[c', '[]', empty=False)
-> 'aaa', 'bb[c'
Birden çok sınırlayıcı sağlandığında, dize varsayılan olarak bu sınırlayıcıların olası en uzun dizilerine bölünür veya eğer emptyayarlanmışsa
True, sınırlayıcılar arasındaki boş dizeler de dahil edilir. Bu durumda sınırlayıcıların yalnızca tek karakterler olabileceğini unutmayın.
str_split('aaa, bb : c;', ' ', ',', ':', ';')
-> 'aaa', 'bb', 'c'
str_split('aaa, bb : c;', *' ,:;', empty=True)
-> 'aaa', '', 'bb', '', '', 'c', ''
Sınırlayıcı sağlanmadığında string.whitespacekullanıldığında, str.split()bu işlevin bir jeneratör olması dışında etki ile aynıdır .
str_split('aaa\\t bb c \\n')
-> 'aaa', 'bb', 'c'
import string
def _str_split_chars(s, delims):
"Split the string `s` by characters contained in `delims`, including the \
empty parts between two consecutive delimiters"
start = 0
for i, c in enumerate(s):
if c in delims:
yield s[start:i]
start = i+1
yield s[start:]
def _str_split_chars_ne(s, delims):
"Split the string `s` by longest possible sequences of characters \
contained in `delims`"
start = 0
in_s = False
for i, c in enumerate(s):
if c in delims:
if in_s:
yield s[start:i]
in_s = False
else:
if not in_s:
in_s = True
start = i
if in_s:
yield s[start:]
def _str_split_word(s, delim):
"Split the string `s` by the string `delim`"
dlen = len(delim)
start = 0
try:
while True:
i = s.index(delim, start)
yield s[start:i]
start = i+dlen
except ValueError:
pass
yield s[start:]
def _str_split_word_ne(s, delim):
"Split the string `s` by the string `delim`, not including empty parts \
between two consecutive delimiters"
dlen = len(delim)
start = 0
try:
while True:
i = s.index(delim, start)
if start!=i:
yield s[start:i]
start = i+dlen
except ValueError:
pass
if start<len(s):
yield s[start:]
def str_split(s, *delims, empty=None):
"""\
Split the string `s` by the rest of the arguments, possibly omitting
empty parts (`empty` keyword argument is responsible for that).
This is a generator function.
When only one delimiter is supplied, the string is simply split by it.
`empty` is then `True` by default.
str_split('[]aaa[][]bb[c', '[]')
-> '', 'aaa', '', 'bb[c'
str_split('[]aaa[][]bb[c', '[]', empty=False)
-> 'aaa', 'bb[c'
When multiple delimiters are supplied, the string is split by longest
possible sequences of those delimiters by default, or, if `empty` is set to
`True`, empty strings between the delimiters are also included. Note that
the delimiters in this case may only be single characters.
str_split('aaa, bb : c;', ' ', ',', ':', ';')
-> 'aaa', 'bb', 'c'
str_split('aaa, bb : c;', *' ,:;', empty=True)
-> 'aaa', '', 'bb', '', '', 'c', ''
When no delimiters are supplied, `string.whitespace` is used, so the effect
is the same as `str.split()`, except this function is a generator.
str_split('aaa\\t bb c \\n')
-> 'aaa', 'bb', 'c'
"""
if len(delims)==1:
f = _str_split_word if empty is None or empty else _str_split_word_ne
return f(s, delims[0])
if len(delims)==0:
delims = string.whitespace
delims = set(delims) if len(delims)>=4 else ''.join(delims)
if any(len(d)>1 for d in delims):
raise ValueError("Only 1-character multiple delimiters are supported")
f = _str_split_chars if empty else _str_split_chars_ne
return f(s, delims)
Bu işlev Python 3'te çalışır ve hem 2 hem de 3 sürümde çalışmasını sağlamak için oldukça çirkin olsa da kolay bir düzeltme uygulanabilir. İşlevin ilk satırları şu şekilde değiştirilmelidir:
def str_split(s, *delims, **kwargs):
"""...docstring..."""
empty = kwargs.get('empty')