Pisahkan string berdasarkan pada ekspresi reguler


143

Saya memiliki output dari perintah dalam bentuk tabel. Saya parsing output ini dari file hasil dan menyimpannya dalam sebuah string. Setiap elemen dalam satu baris dipisahkan oleh satu atau lebih karakter spasi, jadi saya menggunakan ekspresi reguler untuk mencocokkan 1 atau lebih spasi dan membaginya. Namun, ruang dimasukkan di antara setiap elemen:

>>> 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!!!

Apakah ada cara yang lebih baik untuk melakukan ini?

Setelah setiap perpecahan str2ditambahkan ke daftar.


1
Saya menurunkan pertanyaan ini. Alasannya adalah meskipun pertanyaan itu sendiri relevan, contoh yang diberikan tidak cukup sulit untuk benar-benar membutuhkan solusi yang diminta. Regex akan diperlukan jika Anda memiliki misalnya blok kata, blok angka dan Anda ingin memisahkannya menjadi variabel yang berbeda.
erikbwork

@ erikbwork Saya ingin menghapus item ruang yang tidak diinginkan dalam string yang dihasilkan'str2'
user2763554

1
Ya dan Anda dapat mencapainya hanya dengan menggunakan str1.split(). Tidak perlu regex.
erikbwork

Jawaban:


176

Dengan menggunakan (,, )Anda menangkap grup, jika Anda cukup menghapusnya, Anda tidak akan mengalami masalah ini.

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

Namun tidak perlu untuk regex, str.splittanpa pembatas yang ditentukan akan membaginya dengan spasi putih untuk Anda. Ini akan menjadi cara terbaik dalam hal ini.

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

Jika Anda benar-benar ingin regex, Anda dapat menggunakan ini ( '\s'mewakili spasi dan lebih jelas):

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

atau Anda dapat menemukan semua karakter non-spasi putih

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

4
Tetap sederhana. str.splitjelas yang terbaik: D
jamylak

Bagaimana saya bisa menggunakan ini jika saya memiliki string yang dimulai dan diakhiri dengan withspace. contoh: 'abc de'. Untuk ini hasilnya muncul sebagai['', 'a', 'b', 'c', 'de', '']
Rakholiya Jenish

@RakholiyaJenishstr1.split()
jamylak

@ jamylak string.split()adalah sebuah opsi. Saya bertanya apakah itu bisa dilakukan dengan regex juga?
Rakholiya Jenish

2
@RakholiyaJenish Tidak bisakah kamu menggunakan re.findallopsi?
jamylak


7

Saat Anda menggunakan re.splitdan pola perpecahan berisi grup penangkap, grup dipertahankan dalam output. Jika Anda tidak menginginkan ini, gunakan grup yang tidak menangkap sebagai gantinya.


2
Menggunakan str.splitmungkin lebih baik untuk contoh Anda. Saya hanya ingin menjelaskan mengapa Anda mendapatkan perilaku yang Anda lakukan.
BrenBarn

2

Sebenarnya sangat sederhana. Coba ini:

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

2
Saya akan memberi ini +1 tetapi Anda menggunakan semi-titik dua yang jelek.
jamylak

3
@jamylak Lol. Saya akan mengubahnya. :) Kebiasaan menggunakan java dan python!
Terkutuk

1
@ GururajY.S. Jika Anda hanya ingin membagi berdasarkan ruang, Anda hanya perlu menggunakanstringToSplit.split()
sialan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.