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() Show
Đã 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:
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:
Đã 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 2 hiệu quả của Python:
where:
Đ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 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
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 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):
Tiếp theo, chúng tôi sử dụng 3 (như được đưa ra bởi câu trả lời được đề xuất). Nhanh hơn nhiều:
Cuối cùng, chúng tôi sử dụng 4:
Explanation: 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, 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 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 8 cũ tốt. 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 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'.
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 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 2 thay cho danh sách được xác định thủ công.Tùy chọn 1 - Re.SubTô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.
Trong giải pháp này, tôi đã lồng tiếng cho 3 bên trong 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. 0Thay 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, 5 có sẵn trong không gian tên toàn cầu mà không cần nhập nó từ functools.) 1Đã trả lời ngày 10 tháng 11 năm 2016 lúc 17:31Nov 10, 2016 at 17:31
2 2Sau đó, điều này trở thành một lớp ba: 3Giả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 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ư 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ó 8 theo mặc định.Ưu điểm của phương pháp này:
Đã 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: 4Tháng 9 Về cơ bản nó giống như is a method used by 'in' operator. Basically it is the same as 5Như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
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: 6kết quả trong: 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: 8cái này sẽ in 9Đã trả lời ngày 29 tháng 6 năm 2009 lúc 18:01Jun 29, 2009 at 18:01
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.
5
Bạn có thể thấy "dấu câu": 9Ví dụ của bạn: 0Để biết thêm thông tin, bạn có thể tham khảo:
Đã trả lời ngày 15 tháng 7 năm 2018 lúc 15:09Jul 15, 2018 at 15:09
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. 2Tham 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: 3Đã trả lời ngày 10 tháng 9 năm 2018 lúc 15:32Sep 10, 2018 at 15:32
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: 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 2Đã trả lời ngày 3 tháng 3 năm 2018 lúc 23:59Mar 3, 2018 at 23:59
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 4): 3Chứ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 4): 4Nó 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 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: 5Tấ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. 6Nó dường như đang hoạt động tốt, ít nhất là cho các ví dụ dưới đây. 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). 8Bản in này: 9Hạ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.
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 9Nhậ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ó. 0
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. 1Hoặc trong một dòng, chúng ta có thể làm như thế này: 2Cậ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: 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: 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: 5Đã trả lời ngày 6 tháng 8 năm 2011 lúc 11:38Aug 6, 2011 at 11:38
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 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
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 7192 Huy hiệu ĐồngApr 29, 2013 at 5:32
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. 8Đã trả lời ngày 7 tháng 2 năm 2014 lúc 23:15Feb 7, 2014 at 23:15
9Đây là cách sử dụng: 0
Đã 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: 1Đã trả lời ngày 22 tháng 1 năm 2018 lúc 8:25Jan 22, 2018 at 8:25
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 . |