Python แยกสตริงตาม regex


115

วิธีที่ดีที่สุดในการแยกสตริง"HELLO there HOW are YOU"โดยใช้คำตัวพิมพ์ใหญ่ (ใน Python) คืออะไร?

ดังนั้นฉันจึงจบลงด้วยอาร์เรย์เช่นนี้: results = ['HELLO there', 'HOW are', 'YOU']


แก้ไข:

ฉันเหนื่อย:

p = re.compile("\b[A-Z]{2,}\b")
print p.split(page_text)

ดูเหมือนจะไม่ได้ผล


2
คุณได้ลองทำอะไรบ้าง? - หาไม่เจอre.split()เหรอ?
Gareth Latty

5
เมื่อคุณพูดอะไรไม่ได้ผลคุณควรอธิบายว่าทำไม คุณได้รับข้อยกเว้นหรือไม่? (ถ้าเป็นเช่นนั้นให้โพสต์ข้อยกเว้นทั้งหมด) คุณได้รับผลลัพธ์ที่ไม่ถูกต้องหรือไม่?
Gareth Latty

คำตอบ:


134

ฉันแนะนำ

l = re.compile("(?<!^)\s+(?=[A-Z])(?!.\s)").split(s)

ตรวจสอบการสาธิตนี้


5
จะเกิดอะไรขึ้นเมื่อคุณไม่ใช้คอมไพล์
Feelsbadman

3
ตามเอกสารใหม่ " การดำเนินการนิพจน์ทั่วไปส่วนใหญ่มีให้ใช้งานเป็นฟังก์ชันระดับโมดูลและเมธอด RegexObject ฟังก์ชันนี้เป็นทางลัดที่ไม่ต้องการให้คุณคอมไพล์ออบเจ็กต์ regex ก่อน แต่พลาดพารามิเตอร์การปรับแต่งบางอย่างไป " คุณสามารถใช้re.split(re.split(pattern, string, maxsplit=0, flags=0))ตามที่กล่าวไว้ในเอกสารที่อ้างถึงก่อนหน้านี้
ZaydH

57

คุณสามารถใช้ Lookahead:

re.split(r'[ ](?=[A-Z]+\b)', input)

สิ่งนี้จะแบ่งทุกช่องว่างที่ตามด้วยสตริงของตัวอักษรตัวพิมพ์ใหญ่ซึ่งลงท้ายด้วยขอบเขตคำ

โปรดทราบว่าวงเล็บเหลี่ยมมีไว้เพื่อความสามารถในการอ่านเท่านั้นและสามารถละเว้นได้เช่นกัน

หากอักษรตัวแรกของคำนั้นเพียงพอที่จะเป็นตัวพิมพ์ใหญ่ (ดังนั้นหากคุณต้องการแบ่งด้านหน้าHelloด้วย) จะง่ายยิ่งขึ้น:

re.split(r'[ ](?=[A-Z])', input)

ตอนนี้จะแบ่งทุกช่องว่างตามด้วยตัวอักษรตัวพิมพ์ใหญ่


1
ฉันจะเปลี่ยนยังไงre.split(r'[ ](?=[A-Z]+\b)', input)ให้มันไม่เจอตัวพิมพ์ใหญ่ เช่นมันจะไม่ตรงกับ "A"? ฉันพยายามre.split(r'[ ](?=[A-Z]{2,}+\b)', input)แล้ว ขอบคุณ!

@JamesEggers คุณหมายความว่าคุณต้องการใช้ตัวอักษรตัวพิมพ์ใหญ่อย่างน้อยสองตัวเพื่อที่คุณจะได้ไม่แยกคำเช่นI? re.split(r'[ ](?=[A-Z]{2,}\b)', input)ควรทำ
Martin Ender

2
ฉันขอแนะนำอย่างน้อย[ ]+หรืออาจ\W+จะจับคดีได้มากกว่านี้เล็กน้อย ยังคงเป็นคำตอบที่ดี
georg

ฉันลองใช้แนวทางเดียวกัน อย่างไรก็ตามการมี[ ]ไม่ได้ผลสำหรับฉัน แต่ฉันใช้\s. regexp ที่สมบูรณ์สำหรับฉันคือre.split("\s(?=[A-Z]+\s)", string)
h3xh4wk

0

คำถามของคุณมีสตริงลิเทอรั"\b[A-Z]{2,}\b"ล แต่นั่น\bจะหมายถึง backspace เนื่องจากไม่มี r-modifier

ลอง: r"\b[A-Z]{2,}\b".

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