แยกจากที่เกิดขึ้นครั้งแรก


309

อะไรจะเป็นวิธีที่ดีที่สุดในการแบ่งสตริงในการเกิดขึ้นครั้งแรกของตัวคั่น?

ตัวอย่างเช่น:

"123mango abcd mango kiwi peach"

แยกเป็นคนแรกที่mangoจะได้รับ:

"abcd mango kiwi peach"

คำตอบ:


522

จากเอกสาร :

str.split([sep[, maxsplit]])

ส่งคืนรายการคำในสตริงโดยใช้sepเป็นสตริงตัวคั่น หากmaxsplitได้รับการแยกmaxsplitส่วนใหญ่จะเสร็จสิ้น (ดังนั้นรายการจะมีmaxsplit+1องค์ประกอบมากที่สุด)

s.split('mango', 1)[1]

หมายเหตุ: หากสามารถแยกได้มากขึ้นหลังจากถึงการmaxsplitนับองค์ประกอบสุดท้ายในรายการจะมีส่วนที่เหลือของสตริง (รวมถึงsepตัวอักษร / สตริงใด ๆ)
BuvinJ

64
>>> s = "123mango abcd mango kiwi peach"
>>> s.split("mango", 1)
['123', ' abcd mango kiwi peach']
>>> s.split("mango", 1)[1]
' abcd mango kiwi peach'

8
@Swiss: ดังนั้นอะไร เทคนิคยังคงเหมือนเดิม
Ignacio Vazquez-Abrams

6
@Ignacio: ฉันแค่ชี้ให้เห็น ไม่มีเหตุผลที่จะมีคำตอบที่ถูกต้องบางส่วนแทนที่คำตอบที่ถูกต้องอย่างสมบูรณ์
สวิส

ในทางเทคนิคถือว่าตัวคั่นที่ถูกต้อง ดัชนี 'แรก' คือดัชนี [1] แน่นอนเราทุกคนที่อ้างอิงจะเป็นดัชนี zero-ith : D ความหมาย
Izaac Corbett

27

สำหรับฉันวิธีที่ดีกว่าคือ:

s.split('mango', 1)[-1]

... เพราะถ้าเกิดขึ้นสิ่งนั้นไม่อยู่ในสตริคุณจะได้ "IndexError: list index out of range""

ดังนั้น-1จะไม่ได้รับอันตรายใด ๆ ทำให้เกิดการตั้งค่าหมายเลขหนึ่งแล้ว


1
ตามที่เขียนไว้ก่อนหน้านี้คือจำนวนครั้งที่มีการแยกเมธอด () วิธีการจะค้นหาและใช้เฉพาะสตริง 'มะม่วง' ตัวแรก
Alex

2

คุณยังสามารถใช้str.partition:

>>> text = "123mango abcd mango kiwi peach"

>>> text.partition("mango")
('123', 'mango', ' abcd mango kiwi peach')

>>> text.partition("mango")[-1]
' abcd mango kiwi peach'

>>> text.partition("mango")[-1].lstrip()  # if whitespace strip-ing is needed
'abcd mango kiwi peach'

ข้อได้เปรียบของการใช้str.partitionคือมันจะส่งคืน tuple ในแบบฟอร์มเสมอ:

(<pre>, <separator>, <post>)

ดังนั้นนี้จะทำให้การเอาออกเอาท์พุทที่มีความยืดหยุ่นมากเช่นมีเสมอจะเป็น 3 องค์ประกอบใน tuple ที่เกิด


-2
df.columnname[1].split('.', 1)

สิ่งนี้จะแบ่งข้อมูลด้วยการปรากฏครั้งแรกของ '.' ในค่าสตริงหรือคอลัมน์ข้อมูลกรอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.