Hướng dẫn python split with several separators - tách python với một số dấu phân cách

re.split()

Re.Split (mẫu, chuỗi [, MaxSplit = 0])

Chuỗi phân chia theo các lần xuất hiện của mẫu. Nếu chụp dấu ngoặc đơn được sử dụng trong mẫu, thì văn bản của tất cả các nhóm trong mẫu cũng được trả về như một phần của danh sách kết quả. Nếu MAXSplit là không khác biệt, tại hầu hết các phân tách MaxSplit xảy ra và phần còn lại của chuỗi được trả về làm yếu tố cuối cùng của danh sách. .

>>> re.split('\W+', 'Words, words, words.')
['Words', 'words', 'words', '']
>>> re.split('(\W+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split('\W+', 'Words, words, words.', 1)
['Words', 'words, words.']

Hướng dẫn python split with several separators - tách python với một số dấu phân cách

Đã trả lời ngày 29 tháng 6 năm 2009 lúc 17:57Jun 29, 2009 at 17:57

Gimelgimelgimel

Huy hiệu vàng 80,8K1010 gold badges74 silver badges104 bronze badges

8

Một trường hợp biểu thức chính quy được chứng minh:

import re
DATA = "Hey, you - what are you doing here!?"
print re.findall(r"[\w']+", DATA)
# Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']

Hướng dẫn python split with several separators - tách python với một số dấu phân cách

Bartoszkp

33.9K14 Huy hiệu vàng104 Huy hiệu bạc129 Huy hiệu đồng14 gold badges104 silver badges129 bronze badges

Đã trả lời ngày 29 tháng 6 năm 2009 lúc 17:56Jun 29, 2009 at 17:56

RichiehindlerichiehindleRichieHindle

265K46 Huy hiệu vàng354 Huy hiệu bạc395 Huy hiệu Đồng46 gold badges354 silver badges395 bronze badges

18

Một cách nhanh chóng khác để làm điều này mà không có regexp là thay thế các ký tự trước, như dưới đây:

>>> 'a;bcd,ef g'.replace(';',' ').replace(',',' ').split()
['a', 'bcd', 'ef', 'g']

Đã trả lời ngày 27 tháng 8 năm 2011 lúc 16:10Aug 27, 2011 at 16:10

Louis Lclouis LcLouis LC

5.2641 Huy hiệu vàng16 Huy hiệu bạc13 Huy hiệu đồng1 gold badge16 silver badges13 bronze badges

8

Vì vậy, nhiều câu trả lời, nhưng tôi không thể tìm thấy bất kỳ giải pháp nào hiệu quả những gì tiêu đề của các câu hỏi theo nghĩa đen yêu cầu (chia tách trên nhiều bộ tách có thể có, thay vào đó, nhiều câu trả lời chia cho bất cứ điều gì không phải là một từ khác nhau). Vì vậy, đây là một câu trả lời cho câu hỏi trong tiêu đề, dựa vào mô -đun

import string
punc = string.punctuation
thestring = "Hey, you - what are you doing here!?"
s = list(thestring)
''.join([o for o in s if not o in punc]).split()
2 hiệu quả của Python:

>>> import re  # Will be splitting on: ,  - ! ? :
>>> filter(None, re.split("[, \-!?:]+", "Hey, you - what are you doing here!?"))
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']

where:

  • import string
    punc = string.punctuation
    thestring = "Hey, you - what are you doing here!?"
    s = list(thestring)
    ''.join([o for o in s if not o in punc]).split()
    
    3 phù hợp với một trong các dấu phân cách được liệt kê bên trong,
  • import string
    punc = string.punctuation
    thestring = "Hey, you - what are you doing here!?"
    s = list(thestring)
    ''.join([o for o in s if not o in punc]).split()
    
    4 trong biểu thức chính quy là ở đây để ngăn chặn cách giải thích đặc biệt của
    import string
    punc = string.punctuation
    thestring = "Hey, you - what are you doing here!?"
    s = list(thestring)
    ''.join([o for o in s if not o in punc]).split()
    
    5 dưới dạng chỉ báo phạm vi ký tự (như trong
    import string
    punc = string.punctuation
    thestring = "Hey, you - what are you doing here!?"
    s = list(thestring)
    ''.join([o for o in s if not o in punc]).split()
    
    6),
  • import string
    punc = string.punctuation
    thestring = "Hey, you - what are you doing here!?"
    s = list(thestring)
    ''.join([o for o in s if not o in punc]).split()
    
    7 bỏ qua một hoặc nhiều dấu phân cách (nó có thể được bỏ qua nhờ
    import string
    punc = string.punctuation
    thestring = "Hey, you - what are you doing here!?"
    s = list(thestring)
    ''.join([o for o in s if not o in punc]).split()
    
    8, nhưng điều này sẽ tạo ra các chuỗi trống một cách không cần thiết giữa các dấu phân cách đơn lẻ phù hợp) và
  • import string
    punc = string.punctuation
    thestring = "Hey, you - what are you doing here!?"
    s = list(thestring)
    ''.join([o for o in s if not o in punc]).split()
    
    9 loại bỏ các chuỗi trống có thể được tạo bằng các dấu phân cách dẫn đầu và dấu vết (vì các chuỗi trống có giá trị boolean sai).

Điều này chính xác là "chia tách với nhiều dấu phân cách", như được hỏi trong tiêu đề câu hỏi.

Giải pháp này còn miễn nhiễm với các vấn đề với các ký tự không phải ASCII trong các từ được tìm thấy trong một số giải pháp khác (xem nhận xét đầu tiên cho câu trả lời của Ghostdog74).

Mô -đun

import string
punc = string.punctuation
thestring = "Hey, you - what are you doing here!?"
s = list(thestring)
''.join([o for o in s if not o in punc]).split()
2 hiệu quả hơn nhiều (về tốc độ và điểm hòa) so với thực hiện các vòng lặp và thử nghiệm Python "bằng tay"!

Đã trả lời ngày 18 tháng 5 năm 2014 lúc 9:43May 18, 2014 at 9:43

Eric o lebigoteric o lebigotEric O Lebigot

88.4K47 Huy hiệu vàng213 Huy hiệu bạc258 Huy hiệu Đồng47 gold badges213 silver badges258 bronze badges

13

Một cách khác, không có regex

import string
punc = string.punctuation
thestring = "Hey, you - what are you doing here!?"
s = list(thestring)
''.join([o for o in s if not o in punc]).split()

Hướng dẫn python split with several separators - tách python với một số dấu phân cách

Terrya

57.4K11 Huy hiệu vàng117 Huy hiệu bạc140 Huy hiệu đồng11 gold badges117 silver badges140 bronze badges

Đã trả lời ngày 21 tháng 7 năm 2009 lúc 6:02Jul 21, 2009 at 6:02

ghostdog74ghostdog74ghostdog74

317K56 Huy hiệu vàng254 Huy hiệu bạc341 Huy hiệu Đồng56 gold badges254 silver badges341 bronze badges

5

Pro-tip: Sử dụng

>>> import timeit
>>> S = 'Hey, you - what are you doing here!?'
>>> def my_split(s, seps):
...     res = [s]
...     for sep in seps:
...         s, res = res, []
...         for seq in s:
...             res += seq.split(sep)
...     return res
... 
>>> timeit.Timer('my_split(S, punctuation)', 'from __main__ import S,my_split; from string import punctuation').timeit()
54.65477919578552
2 cho các hoạt động chuỗi nhanh nhất mà Python có.

Một số bằng chứng ...

Đầu tiên, cách chậm (xin lỗi pprzemek):

>>> import timeit
>>> S = 'Hey, you - what are you doing here!?'
>>> def my_split(s, seps):
...     res = [s]
...     for sep in seps:
...         s, res = res, []
...         for seq in s:
...             res += seq.split(sep)
...     return res
... 
>>> timeit.Timer('my_split(S, punctuation)', 'from __main__ import S,my_split; from string import punctuation').timeit()
54.65477919578552

Tiếp theo, chúng tôi sử dụng

>>> import timeit
>>> S = 'Hey, you - what are you doing here!?'
>>> def my_split(s, seps):
...     res = [s]
...     for sep in seps:
...         s, res = res, []
...         for seq in s:
...             res += seq.split(sep)
...     return res
... 
>>> timeit.Timer('my_split(S, punctuation)', 'from __main__ import S,my_split; from string import punctuation').timeit()
54.65477919578552
3 (như được đưa ra bởi câu trả lời được đề xuất). Nhanh hơn nhiều:

>>> timeit.Timer('findall(r"\w+", S)', 'from __main__ import S; from re import findall').timeit()
4.194725036621094

Cuối cùng, chúng tôi sử dụng

>>> import timeit
>>> S = 'Hey, you - what are you doing here!?'
>>> def my_split(s, seps):
...     res = [s]
...     for sep in seps:
...         s, res = res, []
...         for seq in s:
...             res += seq.split(sep)
...     return res
... 
>>> timeit.Timer('my_split(S, punctuation)', 'from __main__ import S,my_split; from string import punctuation').timeit()
54.65477919578552
4:

>>> from string import translate,maketrans,punctuation 
>>> T = maketrans(punctuation, ' '*len(punctuation))
>>> timeit.Timer('translate(S, T).split()', 'from __main__ import S,T,translate').timeit()
1.2835021018981934

Explanation:

>>> import timeit
>>> S = 'Hey, you - what are you doing here!?'
>>> def my_split(s, seps):
...     res = [s]
...     for sep in seps:
...         s, res = res, []
...         for seq in s:
...             res += seq.split(sep)
...     return res
... 
>>> timeit.Timer('my_split(S, punctuation)', 'from __main__ import S,my_split; from string import punctuation').timeit()
54.65477919578552
2 được triển khai trong C và không giống như nhiều chức năng thao tác chuỗi trong Python,
>>> import timeit
>>> S = 'Hey, you - what are you doing here!?'
>>> def my_split(s, seps):
...     res = [s]
...     for sep in seps:
...         s, res = res, []
...         for seq in s:
...             res += seq.split(sep)
...     return res
... 
>>> timeit.Timer('my_split(S, punctuation)', 'from __main__ import S,my_split; from string import punctuation').timeit()
54.65477919578552
2 không tạo ra một chuỗi mới. Vì vậy, nó nhanh như bạn có thể nhận được để thay thế chuỗi.does not produce a new string. So it's about as fast as you can get for string substitution.

Tuy nhiên, có một chút khó xử, vì nó cần một bảng dịch để thực hiện phép thuật này. Bạn có thể tạo một bảng dịch với chức năng tiện lợi

>>> import timeit
>>> S = 'Hey, you - what are you doing here!?'
>>> def my_split(s, seps):
...     res = [s]
...     for sep in seps:
...         s, res = res, []
...         for seq in s:
...             res += seq.split(sep)
...     return res
... 
>>> timeit.Timer('my_split(S, punctuation)', 'from __main__ import S,my_split; from string import punctuation').timeit()
54.65477919578552
7. Mục tiêu ở đây là dịch tất cả các ký tự không mong muốn sang không gian. Một thay thế một cho một. Một lần nữa, không có dữ liệu mới được sản xuất. Vì vậy, điều này là nhanh chóng!fast!

Tiếp theo, chúng tôi sử dụng

>>> import timeit
>>> S = 'Hey, you - what are you doing here!?'
>>> def my_split(s, seps):
...     res = [s]
...     for sep in seps:
...         s, res = res, []
...         for seq in s:
...             res += seq.split(sep)
...     return res
... 
>>> timeit.Timer('my_split(S, punctuation)', 'from __main__ import S,my_split; from string import punctuation').timeit()
54.65477919578552
8 cũ tốt.
>>> import timeit
>>> S = 'Hey, you - what are you doing here!?'
>>> def my_split(s, seps):
...     res = [s]
...     for sep in seps:
...         s, res = res, []
...         for seq in s:
...             res += seq.split(sep)
...     return res
... 
>>> timeit.Timer('my_split(S, punctuation)', 'from __main__ import S,my_split; from string import punctuation').timeit()
54.65477919578552
8 theo mặc định sẽ hoạt động trên tất cả các ký tự khoảng trắng, nhóm chúng lại với nhau để chia. Kết quả sẽ là danh sách các từ mà bạn muốn. Và cách tiếp cận này nhanh hơn gần 4 lần so với
>>> import timeit
>>> S = 'Hey, you - what are you doing here!?'
>>> def my_split(s, seps):
...     res = [s]
...     for sep in seps:
...         s, res = res, []
...         for seq in s:
...             res += seq.split(sep)
...     return res
... 
>>> timeit.Timer('my_split(S, punctuation)', 'from __main__ import S,my_split; from string import punctuation').timeit()
54.65477919578552
3!

Đã trả lời ngày 30 tháng 8 năm 2012 lúc 4:05Aug 30, 2012 at 4:05

DavedaveDave

3.19029 Huy hiệu bạc26 Huy hiệu đồng29 silver badges26 bronze badges

5

Tôi đã có một vấn đề nan giải tương tự và không muốn sử dụng mô -đun 'Re'.

def my_split(s, seps):
    res = [s]
    for sep in seps:
        s, res = res, []
        for seq in s:
            res += seq.split(sep)
    return res

print my_split('1111  2222 3333;4444,5555;6666', [' ', ';', ','])
['1111', '', '2222', '3333', '4444', '5555', '6666']

Georgy

11.1k7 Huy hiệu vàng62 Huy hiệu bạc70 Huy hiệu đồng7 gold badges62 silver badges70 bronze badges

Đã trả lời ngày 26 tháng 5 năm 2010 lúc 9:31May 26, 2010 at 9:31

pprzemekpprzemekpprzemek

2.4152 huy hiệu vàng25 Huy hiệu bạc25 Huy hiệu đồng2 gold badges25 silver badges25 bronze badges

3

Đầu tiên, tôi muốn đồng ý với những người khác rằng các giải pháp dựa trên Regex hoặc

>>> timeit.Timer('findall(r"\w+", S)', 'from __main__ import S; from re import findall').timeit()
4.194725036621094
1 là hiệu suất nhất. Đối với trường hợp sử dụng của tôi, hiệu suất của chức năng này không đáng kể, vì vậy tôi muốn thêm những ý tưởng mà tôi đã xem xét với các tiêu chí đó.

Mục tiêu chính của tôi là khái quát hóa các ý tưởng từ một số câu trả lời khác thành một giải pháp có thể hoạt động cho các chuỗi chứa nhiều hơn chỉ là các từ regex (tức là, danh sách đen của tập hợp con của ký tự dấu câu so với các ký tự từ trắng).

Lưu ý rằng, trong bất kỳ cách tiếp cận nào, người ta cũng có thể xem xét sử dụng

>>> timeit.Timer('findall(r"\w+", S)', 'from __main__ import S; from re import findall').timeit()
4.194725036621094
2 thay cho danh sách được xác định thủ công.

Tùy chọn 1 - Re.Sub

Tôi đã rất ngạc nhiên khi thấy không có câu trả lời cho đến nay sử dụng re.sub (...). Tôi thấy nó là một cách tiếp cận đơn giản và tự nhiên cho vấn đề này.

import re

my_str = "Hey, you - what are you doing here!?"

words = re.split(r'\s+', re.sub(r'[,\-!?]', ' ', my_str).strip())

Trong giải pháp này, tôi đã lồng tiếng cho

>>> timeit.Timer('findall(r"\w+", S)', 'from __main__ import S; from re import findall').timeit()
4.194725036621094
3 bên trong
>>> timeit.Timer('findall(r"\w+", S)', 'from __main__ import S; from re import findall').timeit()
4.194725036621094
4 - nhưng nếu hiệu suất là rất quan trọng, thì việc biên dịch regex bên ngoài có thể có lợi - đối với trường hợp sử dụng của tôi, sự khác biệt không đáng kể, vì vậy tôi thích sự đơn giản và khả năng đọc.

Tùy chọn 2 - Str.Replace

Đây là một vài dòng nữa, nhưng nó có lợi ích là có thể mở rộng mà không phải kiểm tra xem bạn có cần phải thoát khỏi một nhân vật nhất định trong Regex hay không.

import re
DATA = "Hey, you - what are you doing here!?"
print re.findall(r"[\w']+", DATA)
# Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
0

Thay vào đó, thật tuyệt khi có thể ánh xạ str.replace vào chuỗi, nhưng tôi không nghĩ nó có thể được thực hiện với các chuỗi bất biến và trong khi ánh xạ vào danh sách các ký tự sẽ hoạt động, chạy mọi sự thay thế đối với mọi nhân vật Nghe có vẻ quá mức. (Chỉnh sửa: Xem tùy chọn tiếp theo cho một ví dụ chức năng.)

Tùy chọn 3 - Functools.Reduce

(Trong Python 2,

>>> timeit.Timer('findall(r"\w+", S)', 'from __main__ import S; from re import findall').timeit()
4.194725036621094
5 có sẵn trong không gian tên toàn cầu mà không cần nhập nó từ functools.)

import re
DATA = "Hey, you - what are you doing here!?"
print re.findall(r"[\w']+", DATA)
# Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
1

Đã trả lời ngày 10 tháng 11 năm 2016 lúc 17:31Nov 10, 2016 at 17:31

Hướng dẫn python split with several separators - tách python với một số dấu phân cách

2

import re
DATA = "Hey, you - what are you doing here!?"
print re.findall(r"[\w']+", DATA)
# Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
2

Sau đó, điều này trở thành một lớp ba:

import re
DATA = "Hey, you - what are you doing here!?"
print re.findall(r"[\w']+", DATA)
# Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
3

Giải trình

Đây là những gì trong Haskell được gọi là danh sách Monad. Ý tưởng đằng sau Monad là một lần "trong Monad" You "ở trong Monad" cho đến khi một cái gì đó đưa bạn ra ngoài. Ví dụ: trong Haskell, giả sử bạn ánh xạ hàm Python

>>> timeit.Timer('findall(r"\w+", S)', 'from __main__ import S; from re import findall').timeit()
4.194725036621094
6 qua danh sách. Nếu kết quả là một danh sách, nó sẽ được nối vào danh sách tại chỗ, vì vậy bạn sẽ nhận được một cái gì đó như
>>> timeit.Timer('findall(r"\w+", S)', 'from __main__ import S; from re import findall').timeit()
4.194725036621094
7. Điều này được gọi là tính năng bản đồ (hoặc bản đồ, hoặc có thể là một cái gì đó tương tự). Ý tưởng ở đây là bạn đã có thao tác này mà bạn đang áp dụng (chia tay mã thông báo) và bất cứ khi nào bạn làm điều đó, bạn sẽ tham gia kết quả vào danh sách.

Bạn có thể tóm tắt điều này thành một hàm và có

>>> timeit.Timer('findall(r"\w+", S)', 'from __main__ import S; from re import findall').timeit()
4.194725036621094
8 theo mặc định.

Ưu điểm của phương pháp này:

  • Cách tiếp cận này (không giống như các phương pháp dựa trên regex ngây thơ) có thể hoạt động với các mã thông báo có độ dài tùy ý (mà Regex cũng có thể làm với cú pháp nâng cao hơn).
  • Bạn không bị giới hạn ở các mã thông báo đơn thuần; Bạn có thể có logic tùy ý thay thế cho mỗi mã thông báo, ví dụ như một trong những "mã thông báo" có thể là một hàm phân tách theo dấu ngoặc đơn của nhau.

Đã trả lời ngày 5 tháng 5 năm 2011 lúc 8:35May 5, 2011 at 8:35

Ninjageckoninjageckoninjagecko

85,9K24 Huy hiệu vàng134 Huy hiệu bạc143 Huy hiệu đồng24 gold badges134 silver badges143 bronze badges

5

Tôi thích Re, nhưng đây là giải pháp của tôi mà không có nó:re, but here is my solution without it:

import re
DATA = "Hey, you - what are you doing here!?"
print re.findall(r"[\w']+", DATA)
# Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
4

Tháng 9 Về cơ bản nó giống như is a method used by 'in' operator. Basically it is the same as

import re
DATA = "Hey, you - what are you doing here!?"
print re.findall(r"[\w']+", DATA)
# Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
5

Nhưng ở đây thuận tiện hơn.

Groupby có chuỗi và chức năng của chúng tôi. Nó chia chuỗi theo nhóm bằng cách sử dụng hàm đó: bất cứ khi nào một giá trị chức năng thay đổi - một nhóm mới được tạo. Vì vậy, sep .__ chứa chính xác là những gì chúng ta cần. gets our string and function. It splits string in groups using that function: whenever a value of function changes - a new group is generated. So, sep.__contains__ is exactly what we need.

Groupby trả về một chuỗi các cặp, trong đó cặp [0] là kết quả của chức năng của chúng tôi và cặp [1] là một nhóm. Sử dụng 'Nếu không phải K', chúng tôi lọc ra các nhóm với các dấu phân cách (vì kết quả của sep .__ chứa __ là đúng trên các dấu phân cách). Chà, đó là tất cả - bây giờ chúng tôi có một chuỗi các nhóm trong đó mỗi nhóm là một từ (nhóm thực sự là một điều đáng tin nên chúng tôi sử dụng tham gia để chuyển đổi nó thành chuỗi). returns a sequence of pairs, where pair[0] is a result of our function and pair[1] is a group. Using 'if not k' we filter out groups with separators (because a result of sep.__contains__ is True on separators). Well, that's all - now we have a sequence of groups where each one is a word (group is actually an iterable so we use join to convert it to string).

Giải pháp này khá chung, vì nó sử dụng một hàm để tách chuỗi (bạn có thể chia theo bất kỳ điều kiện nào bạn cần). Ngoài ra, nó không tạo ra các chuỗi/danh sách trung gian (bạn có thể xóa tham gia và biểu thức sẽ trở nên lười biếng, vì mỗi nhóm là một trình lặp lại)join and the expression will become lazy, since each group is an iterator)

Đã trả lời ngày 6 tháng 10 năm 2013 lúc 17:30Oct 6, 2013 at 17:30

Hướng dẫn python split with several separators - tách python với một số dấu phân cách

MonitoriusMonitoriusmonitorius

3.3561 Huy hiệu vàng19 Huy hiệu bạc17 Huy hiệu đồng1 gold badge19 silver badges17 bronze badges

Sử dụng thay thế hai lần:

import re
DATA = "Hey, you - what are you doing here!?"
print re.findall(r"[\w']+", DATA)
# Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
6

kết quả trong:

import re
DATA = "Hey, you - what are you doing here!?"
print re.findall(r"[\w']+", DATA)
# Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
7

Đã trả lời ngày 30 tháng 3 năm 2012 lúc 13:27Mar 30, 2012 at 13:27

Jeroenjeroenjeroen

Huy hiệu 611 Bạc1 Huy hiệu Đồng1 silver badge1 bronze badge

0

thử cái này:

import re
DATA = "Hey, you - what are you doing here!?"
print re.findall(r"[\w']+", DATA)
# Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
8

cái này sẽ in

>>> timeit.Timer('findall(r"\w+", S)', 'from __main__ import S; from re import findall').timeit()
4.194725036621094
9

Đã trả lời ngày 29 tháng 6 năm 2009 lúc 18:01Jun 29, 2009 at 18:01

Hướng dẫn python split with several separators - tách python với một số dấu phân cách

Corey Goldbergcorey GoldbergCorey Goldberg

57.3K27 Huy hiệu vàng123 Huy hiệu bạc141 Huy hiệu đồng27 gold badges123 silver badges141 bronze badges

Trong Python 3, bạn có thể sử dụng phương pháp từ PY4E - Python cho mọi người.

Chúng ta có thể giải quyết cả hai vấn đề này bằng cách sử dụng các phương thức chuỗi

>>> from string import translate,maketrans,punctuation 
>>> T = maketrans(punctuation, ' '*len(punctuation))
>>> timeit.Timer('translate(S, T).split()', 'from __main__ import S,T,translate').timeit()
1.2835021018981934
0,
>>> from string import translate,maketrans,punctuation 
>>> T = maketrans(punctuation, ' '*len(punctuation))
>>> timeit.Timer('translate(S, T).split()', 'from __main__ import S,T,translate').timeit()
1.2835021018981934
1 và
>>> import timeit
>>> S = 'Hey, you - what are you doing here!?'
>>> def my_split(s, seps):
...     res = [s]
...     for sep in seps:
...         s, res = res, []
...         for seq in s:
...             res += seq.split(sep)
...     return res
... 
>>> timeit.Timer('my_split(S, punctuation)', 'from __main__ import S,my_split; from string import punctuation').timeit()
54.65477919578552
4.
>>> import timeit
>>> S = 'Hey, you - what are you doing here!?'
>>> def my_split(s, seps):
...     res = [s]
...     for sep in seps:
...         s, res = res, []
...         for seq in s:
...             res += seq.split(sep)
...     return res
... 
>>> timeit.Timer('my_split(S, punctuation)', 'from __main__ import S,my_split; from string import punctuation').timeit()
54.65477919578552
4 là phương pháp tinh tế nhất. Đây là tài liệu cho
>>> import timeit
>>> S = 'Hey, you - what are you doing here!?'
>>> def my_split(s, seps):
...     res = [s]
...     for sep in seps:
...         s, res = res, []
...         for seq in s:
...             res += seq.split(sep)
...     return res
... 
>>> timeit.Timer('my_split(S, punctuation)', 'from __main__ import S,my_split; from string import punctuation').timeit()
54.65477919578552
4:

>>> from string import translate,maketrans,punctuation 
>>> T = maketrans(punctuation, ' '*len(punctuation))
>>> timeit.Timer('translate(S, T).split()', 'from __main__ import S,T,translate').timeit()
1.2835021018981934
5

Thay thế các ký tự trong

>>> from string import translate,maketrans,punctuation 
>>> T = maketrans(punctuation, ' '*len(punctuation))
>>> timeit.Timer('translate(S, T).split()', 'from __main__ import S,T,translate').timeit()
1.2835021018981934
6 bằng ký tự ở cùng một vị trí trong
>>> from string import translate,maketrans,punctuation 
>>> T = maketrans(punctuation, ' '*len(punctuation))
>>> timeit.Timer('translate(S, T).split()', 'from __main__ import S,T,translate').timeit()
1.2835021018981934
7 và xóa tất cả các ký tự trong
>>> from string import translate,maketrans,punctuation 
>>> T = maketrans(punctuation, ' '*len(punctuation))
>>> timeit.Timer('translate(S, T).split()', 'from __main__ import S,T,translate').timeit()
1.2835021018981934
8.
>>> from string import translate,maketrans,punctuation 
>>> T = maketrans(punctuation, ' '*len(punctuation))
>>> timeit.Timer('translate(S, T).split()', 'from __main__ import S,T,translate').timeit()
1.2835021018981934
6 và
>>> from string import translate,maketrans,punctuation 
>>> T = maketrans(punctuation, ' '*len(punctuation))
>>> timeit.Timer('translate(S, T).split()', 'from __main__ import S,T,translate').timeit()
1.2835021018981934
7 có thể là các chuỗi trống và tham số
>>> from string import translate,maketrans,punctuation 
>>> T = maketrans(punctuation, ' '*len(punctuation))
>>> timeit.Timer('translate(S, T).split()', 'from __main__ import S,T,translate').timeit()
1.2835021018981934
8 có thể được bỏ qua.

Bạn có thể thấy "dấu câu":

import re
DATA = "Hey, you - what are you doing here!?"
print re.findall(r"[\w']+", DATA)
# Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
9

Ví dụ của bạn:

>>> 'a;bcd,ef g'.replace(';',' ').replace(',',' ').split()
['a', 'bcd', 'ef', 'g']
0

Để biết thêm thông tin, bạn có thể tham khảo:

  • Py4e - Python cho mọi người
  • str.translate
  • str.maketrans
  • Phương thức Python String Maketrans ()

Đã trả lời ngày 15 tháng 7 năm 2018 lúc 15:09Jul 15, 2018 at 15:09

Hướng dẫn python split with several separators - tách python với một số dấu phân cách

2

Thay vì sử dụng chức năng mô -đun RE RE.Split, bạn có thể đạt được kết quả tương tự bằng phương thức sê -ri.Str.Split của gấu trúc.

Đầu tiên, tạo một chuỗi với chuỗi trên và sau đó áp dụng phương thức cho chuỗi.

def my_split(s, seps):
    res = [s]
    for sep in seps:
        s, res = res, []
        for seq in s:
            res += seq.split(sep)
    return res

print my_split('1111  2222 3333;4444,5555;6666', [' ', ';', ','])
['1111', '', '2222', '3333', '4444', '5555', '6666']
2

Tham số Pat lấy các dấu phân cách và trả về chuỗi phân chia dưới dạng một mảng. Ở đây hai phân định được thông qua bằng cách sử dụng | (hoặc toán tử). Đầu ra như sau:

def my_split(s, seps):
    res = [s]
    for sep in seps:
        s, res = res, []
        for seq in s:
            res += seq.split(sep)
    return res

print my_split('1111  2222 3333;4444,5555;6666', [' ', ';', ','])
['1111', '', '2222', '3333', '4444', '5555', '6666']
3

Đã trả lời ngày 10 tháng 9 năm 2018 lúc 15:32Sep 10, 2018 at 15:32

Hướng dẫn python split with several separators - tách python với một số dấu phân cách

1

Tôi đang làm lại cho mình với Python và cần điều tương tự. Giải pháp Findall có thể tốt hơn, nhưng tôi đã đưa ra điều này:

>>> 'a;bcd,ef g'.replace(';',' ').replace(',',' ').split()
['a', 'bcd', 'ef', 'g']
1

Antyrat

27.2k9 Huy hiệu vàng76 Huy hiệu bạc76 Huy hiệu đồng9 gold badges76 silver badges76 bronze badges

Đã trả lời ngày 20 tháng 4 năm 2012 lúc 16:53Apr 20, 2012 at 16:53

Leon Starrleon StarrLeon Starr

4421 Huy hiệu vàng4 Huy hiệu bạc9 Huy hiệu đồng1 gold badge4 silver badges9 bronze badges

1

Sử dụng maketrans và dịch bạn có thể làm điều đó một cách dễ dàng và gọn gàng

>>> 'a;bcd,ef g'.replace(';',' ').replace(',',' ').split()
['a', 'bcd', 'ef', 'g']
2

Đã trả lời ngày 3 tháng 3 năm 2018 lúc 23:59Mar 3, 2018 at 23:59

Hướng dẫn python split with several separators - tách python với một số dấu phân cách

Ritesh Sinharitesh SinhaRitesh Sinha

8004 Huy hiệu vàng20 Huy hiệu bạc48 Huy hiệu đồng4 gold badges20 silver badges48 bronze badges

1

Trước hết, tôi không nghĩ rằng ý định của bạn là thực sự sử dụng dấu chấm câu như là người phân định trong các chức năng phân chia. Mô tả của bạn cho thấy rằng bạn chỉ đơn giản muốn loại bỏ dấu câu từ các chuỗi kết quả.

Tôi bắt gặp điều này khá thường xuyên và giải pháp thông thường của tôi không yêu cầu RE.

Chức năng Lambda One-Liner w/ Danh sách hiểu:

(Yêu cầu

def my_split(s, seps):
    res = [s]
    for sep in seps:
        s, res = res, []
        for seq in s:
            res += seq.split(sep)
    return res

print my_split('1111  2222 3333;4444,5555;6666', [' ', ';', ','])
['1111', '', '2222', '3333', '4444', '5555', '6666']
4):

>>> 'a;bcd,ef g'.replace(';',' ').replace(',',' ').split()
['a', 'bcd', 'ef', 'g']
3

Chức năng (truyền thống)

Là một chức năng truyền thống, đây vẫn chỉ là hai dòng có khả năng hiểu danh sách (ngoài

def my_split(s, seps):
    res = [s]
    for sep in seps:
        s, res = res, []
        for seq in s:
            res += seq.split(sep)
    return res

print my_split('1111  2222 3333;4444,5555;6666', [' ', ';', ','])
['1111', '', '2222', '3333', '4444', '5555', '6666']
4):

>>> 'a;bcd,ef g'.replace(';',' ').replace(',',' ').split()
['a', 'bcd', 'ef', 'g']
4

Nó cũng sẽ tự nhiên để lại các cơn co thắt và các từ hyphenated còn nguyên vẹn. Bạn luôn có thể sử dụng

def my_split(s, seps):
    res = [s]
    for sep in seps:
        s, res = res, []
        for seq in s:
            res += seq.split(sep)
    return res

print my_split('1111  2222 3333;4444,5555;6666', [' ', ';', ','])
['1111', '', '2222', '3333', '4444', '5555', '6666']
6 để biến dấu gạch nối thành không gian trước khi chia.

Chức năng chung w/o Lambda hoặc danh sách hiểu

Đối với một giải pháp chung hơn (nơi bạn có thể chỉ định các ký tự để loại bỏ) và không có sự hiểu biết danh sách, bạn sẽ nhận được:

>>> 'a;bcd,ef g'.replace(';',' ').replace(',',' ').split()
['a', 'bcd', 'ef', 'g']
5

Tất nhiên, bạn luôn có thể khái quát chức năng Lambda cho bất kỳ chuỗi ký tự được chỉ định nào.

Đã trả lời ngày 4 tháng 11 năm 2014 lúc 19:17Nov 4, 2014 at 19:17

CosmicflukecosmicflukecosmicFluke

3551 Huy hiệu bạc10 Huy hiệu đồng1 silver badge10 bronze badges

Tôi đã phải đưa ra giải pháp của riêng mình vì mọi thứ tôi đã thử nghiệm cho đến nay đều thất bại tại một số điểm.

>>> 'a;bcd,ef g'.replace(';',' ').replace(',',' ').split()
['a', 'bcd', 'ef', 'g']
6

Nó dường như đang hoạt động tốt, ít nhất là cho các ví dụ dưới đây.

>>> 'a;bcd,ef g'.replace(';',' ').replace(',',' ').split()
['a', 'bcd', 'ef', 'g']
7

Đã trả lời ngày 23 tháng 5 năm 2019 lúc 23:06May 23, 2019 at 23:06

Gỗ gỗWood

Huy hiệu bạc 2411 Bạc81 silver badge8 bronze badges

Một cách khác để đạt được điều này là sử dụng Bộ công cụ ngôn ngữ tự nhiên (NLTK).

>>> 'a;bcd,ef g'.replace(';',' ').replace(',',' ').split()
['a', 'bcd', 'ef', 'g']
8

Bản in này:

>>> timeit.Timer('findall(r"\w+", S)', 'from __main__ import S; from re import findall').timeit()
4.194725036621094
9

Hạn chế lớn nhất của phương pháp này là bạn cần cài đặt gói NLTK.

Những lợi ích là bạn có thể làm rất nhiều thứ thú vị với phần còn lại của gói NLTK sau khi bạn nhận được mã thông báo của mình.

Hướng dẫn python split with several separators - tách python với một số dấu phân cách

Martlark

13.5K12 Huy hiệu vàng81 Huy hiệu bạc97 Huy hiệu đồng12 gold badges81 silver badges97 bronze badges

Đã trả lời ngày 29 tháng 6 năm 2009 lúc 18:51Jun 29, 2009 at 18:51

tgraytgraytgray

8.6665 Huy hiệu vàng35 Huy hiệu bạc40 Huy hiệu đồng5 gold badges35 silver badges40 bronze badges

Có vấn đề tương tự như @ooboo và tìm chủ đề này @Ghostdog74 đã truyền cảm hứng cho tôi, có lẽ ai đó tìm thấy giải pháp của tôi hữu ích

>>> 'a;bcd,ef g'.replace(';',' ').replace(',',' ').split()
['a', 'bcd', 'ef', 'g']
9

Nhập một cái gì đó vào Place Space và tách bằng cách sử dụng cùng một ký tự nếu bạn không muốn phân chia tại không gian.

Đã trả lời ngày 15 tháng 3 năm 2011 lúc 10:12Mar 15, 2011 at 10:12

Badasbadasbadas

192 Huy hiệu Đồng2 bronze badges

1

Trước hết, luôn luôn sử dụng re.compile () trước khi thực hiện bất kỳ hoạt động regex nào trong một vòng lặp vì nó hoạt động nhanh hơn hoạt động bình thường.

Vì vậy, đối với vấn đề của bạn trước tiên biên dịch mẫu và sau đó thực hiện hành động trên nó.

>>> import re  # Will be splitting on: ,  - ! ? :
>>> filter(None, re.split("[, \-!?:]+", "Hey, you - what are you doing here!?"))
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
0

Hướng dẫn python split with several separators - tách python với một số dấu phân cách

Lovasoa

6.0961 Huy hiệu vàng32 Huy hiệu bạc42 Huy hiệu đồng1 gold badge32 silver badges42 bronze badges

Đã trả lời ngày 2 tháng 6 năm 2015 lúc 7:06Jun 2, 2015 at 7:06

ShrikantshrikantShrikant

3836 Huy hiệu bạc7 Huy hiệu Đồng6 silver badges7 bronze badges

Đây là câu trả lời với một số giải thích.

>>> import re  # Will be splitting on: ,  - ! ? :
>>> filter(None, re.split("[, \-!?:]+", "Hey, you - what are you doing here!?"))
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
1

Hoặc trong một dòng, chúng ta có thể làm như thế này:

>>> import re  # Will be splitting on: ,  - ! ? :
>>> filter(None, re.split("[, \-!?:]+", "Hey, you - what are you doing here!?"))
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
2

Cập nhật câu trả lời

Đã trả lời ngày 4 tháng 6 năm 2016 lúc 19:35Jun 4, 2016 at 19:35

0

Tạo một hàm lấy làm hai chuỗi đầu vào (chuỗi nguồn sẽ được phân chia và chuỗi phân tách danh sách phân chia) và xuất ra một danh sách các từ phân chia:

>>> import re  # Will be splitting on: ,  - ! ? :
>>> filter(None, re.split("[, \-!?:]+", "Hey, you - what are you doing here!?"))
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
3

Fpietka

1,0071 Huy hiệu vàng10 Huy hiệu bạc22 Huy hiệu đồng1 gold badge10 silver badges22 bronze badges

Đã trả lời ngày 10 tháng 5 năm 2017 lúc 0:58May 10, 2017 at 0:58

Tôi thích giải pháp của PPRZEMK vì nó không cho rằng các dấu phân cách là các ký tự đơn và nó không cố gắng tận dụng một regex (sẽ không hoạt động tốt nếu số lượng dấu phân cách được phát điên dài).

Đây là phiên bản dễ đọc hơn của giải pháp trên cho rõ ràng:

>>> import re  # Will be splitting on: ,  - ! ? :
>>> filter(None, re.split("[, \-!?:]+", "Hey, you - what are you doing here!?"))
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
4

Đã trả lời ngày 23 tháng 5 năm 2019 lúc 17:03May 23, 2019 at 17:03

EveretteverettEverett

7.8934 Huy hiệu vàng33 Huy hiệu bạc45 Huy hiệu Đồng4 gold badges33 silver badges45 bronze badges

Đây là sự phân chia của tôi với nhiều Deliminaters:

>>> import re  # Will be splitting on: ,  - ! ? :
>>> filter(None, re.split("[, \-!?:]+", "Hey, you - what are you doing here!?"))
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
5

Đã trả lời ngày 6 tháng 8 năm 2011 lúc 11:38Aug 6, 2011 at 11:38

Hướng dẫn python split with several separators - tách python với một số dấu phân cách

MartlarkmartlarkMartlark

13.5K12 Huy hiệu vàng81 Huy hiệu bạc97 Huy hiệu đồng12 gold badges81 silver badges97 bronze badges

Đã trả lời ngày 29 tháng 6 năm 2009 lúc 18:51

tgraytgray

>>> import re  # Will be splitting on: ,  - ! ? :
>>> filter(None, re.split("[, \-!?:]+", "Hey, you - what are you doing here!?"))
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
6

8.6665 Huy hiệu vàng35 Huy hiệu bạc40 Huy hiệu đồng

Có vấn đề tương tự như @ooboo và tìm chủ đề này @Ghostdog74 đã truyền cảm hứng cho tôi, có lẽ ai đó tìm thấy giải pháp của tôi hữu ích42 gold badges127 silver badges195 bronze badges

>>> 'a;bcd,ef g'.replace(';',' ').replace(',',' ').split()
['a', 'bcd', 'ef', 'g']
9Mar 9, 2012 at 8:30

Nhập một cái gì đó vào Place Space và tách bằng cách sử dụng cùng một ký tự nếu bạn không muốn phân chia tại không gian.nemozhp

Đã trả lời ngày 15 tháng 3 năm 2011 lúc 10:121 silver badge7 bronze badges

1

Badasbadas

>>> import re  # Will be splitting on: ,  - ! ? :
>>> filter(None, re.split("[, \-!?:]+", "Hey, you - what are you doing here!?"))
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
7

192 Huy hiệu ĐồngApr 29, 2013 at 5:32

Hướng dẫn python split with several separators - tách python với một số dấu phân cách

Trước hết, luôn luôn sử dụng re.compile () trước khi thực hiện bất kỳ hoạt động regex nào trong một vòng lặp vì nó hoạt động nhanh hơn hoạt động bình thường.

>>> import re  # Will be splitting on: ,  - ! ? :
>>> filter(None, re.split("[, \-!?:]+", "Hey, you - what are you doing here!?"))
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
8

Đã trả lời ngày 7 tháng 2 năm 2014 lúc 23:15Feb 7, 2014 at 23:15

Hướng dẫn python split with several separators - tách python với một số dấu phân cách

>>> import re  # Will be splitting on: ,  - ! ? :
>>> filter(None, re.split("[, \-!?:]+", "Hey, you - what are you doing here!?"))
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
9

Đây là cách sử dụng:

import string
punc = string.punctuation
thestring = "Hey, you - what are you doing here!?"
s = list(thestring)
''.join([o for o in s if not o in punc]).split()
0

Hướng dẫn python split with several separators - tách python với một số dấu phân cách

Đã trả lời ngày 24 tháng 12 năm 2013 lúc 2:17Dec 24, 2013 at 2:17

Nếu bạn muốn một thao tác đảo ngược (bảo tồn các dấu phân cách), bạn có thể sử dụng chức năng này:

import string
punc = string.punctuation
thestring = "Hey, you - what are you doing here!?"
s = list(thestring)
''.join([o for o in s if not o in punc]).split()
1

Đã trả lời ngày 22 tháng 1 năm 2018 lúc 8:25Jan 22, 2018 at 8:25

Hướng dẫn python split with several separators - tách python với một số dấu phân cách

Nathan Bnathan bNathan B

1.5101 Huy hiệu vàng16 Huy hiệu bạc14 Huy hiệu đồng1 gold badge16 silver badges14 bronze badges

Có thể chia có nhiều dấu phân cách python không?

Chia chuỗi với nhiều dấu phân cách, chúng tôi cũng có thể chỉ định nhiều ký tự là dấu phân cách.Đối với điều này, chúng ta cần sử dụng mô -đun RE của Python và nhập RE.Chia () hàm.We can also specify multiple characters as separators. For this, we need to make use of the re module of Python and import the re. split() function.

Có thể chia có nhiều dấu phân cách không?

Phương thức phân chia có thể được truyền một biểu thức chính quy chứa nhiều ký tự để phân chia chuỗi với nhiều dấu phân cách..

Có thể chia () lấy nhiều đối số?

Phương thức chia () chấp nhận hai đối số.Đối số tùy chọn đầu tiên là dấu phân cách, chỉ định loại phân tách nào sẽ sử dụng để phân tách chuỗi.Nếu đối số này không được cung cấp, giá trị mặc định là bất kỳ khoảng trắng nào, có nghĩa là chuỗi sẽ phân chia bất cứ khi nào.accepts two arguments. The first optional argument is separator , which specifies what kind of separator to use for splitting the string. If this argument is not provided, the default value is any whitespace, meaning the string will split whenever .