นี่คือการนำไปใช้ของฉันซึ่งเร็วกว่าและสมบูรณ์กว่าคำตอบอื่น ๆ ที่นี่มาก มีฟังก์ชั่นย่อย 4 ฟังก์ชันแยกกันสำหรับกรณีต่างๆ
ฉันจะคัดลอก docstring ของstr_split
ฟังก์ชันหลัก:
str_split(s, *delims, empty=None)
แยกสตริงs
ตามส่วนที่เหลือของอาร์กิวเมนต์โดยอาจละเว้นส่วนที่ว่าง ( empty
อาร์กิวเมนต์คำหลักเป็นผู้รับผิดชอบในส่วนนั้น) นี่คือฟังก์ชันเครื่องกำเนิดไฟฟ้า
เมื่อมีตัวคั่นเพียงตัวเดียวสตริงจะถูกแยกออกจากกัน
empty
เป็นแล้วTrue
โดยค่าเริ่มต้น
str_split('[]aaa[][]bb[c', '[]')
-> '', 'aaa', '', 'bb[c'
str_split('[]aaa[][]bb[c', '[]', empty=False)
-> 'aaa', 'bb[c'
เมื่อมีการระบุตัวคั่นหลายตัวสตริงจะถูกแบ่งตามลำดับที่ยาวที่สุดที่เป็นไปได้ของตัวคั่นเหล่านั้นตามค่าเริ่มต้นหรือหากempty
ตั้งค่าเป็น
True
สตริงว่างระหว่างตัวคั่นจะรวมอยู่ด้วย โปรดทราบว่าตัวคั่นในกรณีนี้ต้องเป็นอักขระเดี่ยวเท่านั้น
str_split('aaa, bb : c;', ' ', ',', ':', ';')
-> 'aaa', 'bb', 'c'
str_split('aaa, bb : c;', *' ,:;', empty=True)
-> 'aaa', '', 'bb', '', '', 'c', ''
เมื่อไม่มีการระบุตัวคั่นจะstring.whitespace
ถูกใช้ดังนั้นเอฟเฟกต์จะเหมือนกับstr.split()
ยกเว้นฟังก์ชันนี้เป็นตัวสร้าง
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)
ฟังก์ชั่นนี้ใช้งานได้ใน Python 3 และสามารถใช้การแก้ไขที่ง่าย แต่ค่อนข้างน่าเกลียดเพื่อให้ใช้งานได้ทั้ง 2 และ 3 เวอร์ชัน บรรทัดแรกของฟังก์ชันควรเปลี่ยนเป็น:
def str_split(s, *delims, **kwargs):
"""...docstring..."""
empty = kwargs.get('empty')