แยกสตริงตามนิพจน์ทั่วไป


143

ฉันมีผลลัพธ์ของคำสั่งในรูปแบบตาราง ฉันแยกวิเคราะห์ผลลัพธ์นี้จากไฟล์ผลลัพธ์และเก็บไว้ในสตริง แต่ละองค์ประกอบในหนึ่งแถวจะถูกคั่นด้วยอักขระช่องว่างอย่างน้อยหนึ่งตัวดังนั้นฉันจึงใช้นิพจน์ทั่วไปเพื่อจับคู่ช่องว่าง 1 หรือมากกว่าแล้วแยกออก อย่างไรก็ตามมีการแทรกช่องว่างระหว่างทุกองค์ประกอบ:

>>> str1="a    b     c      d" # spaces are irregular
>>> str1
'a    b     c      d'
>>> str2=re.split("( )+", str1)
>>> str2
['a', ' ', 'b', ' ', 'c', ' ', 'd'] # 1 space element between!!!

มีวิธีที่ดีกว่าในการทำเช่นนี้?

หลังจากแต่ละการแบ่งstr2ถูกผนวกเข้ากับรายการ


1
ฉันลงคะแนนคำถามนี้ เหตุผลก็คือในขณะที่คำถามตัวเองมีความเกี่ยวข้องตัวอย่างที่ได้รับนั้นไม่ยากพอที่จะต้องการโซลูชันที่ร้องขอ จะต้องใช้ regex หากคุณมีบล็อคคำเช่นบล็อกตัวเลขและคุณต้องการแยกพวกมันออกเป็นตัวแปรต่าง ๆ
erikbwork

@erikbwork ฉันต้องการลบรายการช่องว่างที่ไม่ต้องการในสตริงที่เป็นผลลัพธ์'str2'
user2763554

1
str1.split()ใช่และคุณสามารถประสบความสำเร็จที่มีเพียงแค่ใช้ ไม่จำเป็นต้องใช้ regex
erikbwork

คำตอบ:


176

โดยการใช้(, )คุณจะจับภาพกลุ่มถ้าคุณเพียงแค่ลบพวกเขาคุณจะไม่ได้มีปัญหานี้

>>> str1 = "a    b     c      d"
>>> re.split(" +", str1)
['a', 'b', 'c', 'd']

อย่างไรก็ตามไม่จำเป็นต้องใช้ regex str.splitหากไม่มีตัวคั่นใด ๆ ที่ระบุจะแยกสิ่งนี้ด้วยช่องว่างสำหรับคุณ นี่จะเป็นวิธีที่ดีที่สุดในกรณีนี้

>>> str1.split()
['a', 'b', 'c', 'd']

หากคุณต้องการ regex จริงๆคุณสามารถใช้สิ่งนี้ ( '\s'แทนช่องว่างและชัดเจนยิ่งขึ้น):

>>> re.split("\s+", str1)
['a', 'b', 'c', 'd']

หรือคุณสามารถค้นหาอักขระที่ไม่ใช่ช่องว่างทั้งหมด

>>> re.findall(r'\S+',str1)
['a', 'b', 'c', 'd']

4
ง่าย ๆ เข้าไว้. str.splitดีที่สุดแน่นอน: D
jamylak

ฉันจะใช้สิ่งนี้ได้อย่างไรถ้าฉันมีสตริงที่เริ่มต้นและลงท้ายด้วย withspace ตัวอย่าง: 'abc de' สำหรับผลลัพธ์นี้มาเป็น['', 'a', 'b', 'c', 'de', '']
Rakholiya Jenish

@RakholiyaJenishstr1.split()
jamylak

@jamylak string.split()เป็นตัวเลือก ฉันถูกถามว่าสามารถทำกับ regex ด้วยหรือไม่
Rakholiya Jenish

2
@RakholiyaJenish คุณไม่สามารถใช้re.findallตัวเลือกได้หรือไม่?
jamylak

24

str.splitวิธีโดยอัตโนมัติจะลบพื้นที่สีขาวทั้งหมดระหว่างรายการ:

>>> str1 = "a    b     c      d"
>>> str1.split()
['a', 'b', 'c', 'd']

เอกสารอยู่ที่นี่: http://docs.python.org/library/stdtypes.html#str.split


1
@ GururajY.S .: str.split()อาจเป็นทางเลือกที่ดีที่สุดสำหรับบางสิ่งบางอย่างที่เบาเช่นนี้
Joel Cornett

7

เมื่อคุณใช้re.splitและรูปแบบการแยกประกอบด้วยกลุ่มการจับกลุ่มจะถูกเก็บไว้ในเอาต์พุต หากคุณไม่ต้องการสิ่งนี้ให้ใช้กลุ่มที่ไม่ได้จับภาพแทน


2
การใช้str.splitน่าจะดีกว่าสำหรับตัวอย่างของคุณ ฉันแค่อยากอธิบายว่าทำไมคุณถึงมีพฤติกรรมที่คุณทำ
BrenBarn

2

มันง่ายมากจริง ๆ ลองสิ่งนี้:

str1="a    b     c      d"
splitStr1 = str1.split()
print splitStr1

2
ฉันจะ +1 สิ่งนี้ แต่คุณใช้เซมิโคลอนน่าเกลียด
jamylak

3
@jamylak Lol ฉันจะเปลี่ยนพวกเขา :) นิสัยในการใช้ java และ python!
สาปแช่ง

1
@ GururajY.S หากคุณเพียงแค่ต้องการที่จะแยกบนพื้นฐานของพื้นที่ที่คุณควรเพียงแค่ใช้stringToSplit.split()
พิลึก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.