Dizeyi normal ifadeye göre bölme


143

Tablo şeklinde bir komut çıktı var. Bu çıktıyı bir sonuç dosyasından ayrıştırıyorum ve bir dizede saklıyorum. Bir satırdaki her öğe bir veya daha fazla boşluk karakteriyle ayrılır, bu nedenle 1 veya daha fazla boşluğu eşleştirmek ve bölmek için normal ifadeler kullanıyorum. Ancak, her öğe arasına boşluk ekleniyor:

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

Bunu yapmanın daha iyi bir yolu var mı?

Her bölme str2bir listeye eklendikten sonra .


1
Bu soruyu reddettim. Bunun nedeni, sorunun kendisiyle alakalı olmasına rağmen, verilen örneğin istenen çözümü gerçekten gerektirecek kadar zor olmamasıdır. Örneğin kelime bloklarınız, sayı bloklarınız varsa ve bunları farklı değişkenlere ayırmak istiyorsanız normal ifade gerekli olacaktır.
erikbwork

@erikbwork Sonuçtaki dizede istenmeyen boşluk öğesini kaldırmak istedim'str2'
user2763554

1
Evet ve bunu sadece kullanarak yapabilirsiniz str1.split(). Normal ifadeye gerek yok.
erikbwork

Yanıtlar:


176

Kullanarak (, )grubu yakalarsınız, bunları kaldırırsanız bu sorun yaşamayacaksınız.

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

Bununla birlikte, regex'e gerek yoktur, str.splitherhangi bir sınırlayıcı belirtilmeden bunu sizin için boşlukla böler. Bu durumda bu en iyi yol olacaktır.

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

Eğer gerçekten normal ifade istiyorsanız bunu kullanabilirsiniz ( '\s'boşlukları temsil eder ve daha nettir):

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

veya boşluk olmayan tüm karakterleri bulabilirsiniz

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

4
Basit tutun. str.splitkesinlikle en iyisi: D
jamylak

Withspace ile başlayan ve biten bir dize varsa bunu nasıl kullanabilirim. örnek: 'abc de'. Bunun için çıktı şu şekilde geliyor['', 'a', 'b', 'c', 'de', '']
Rakholiya Jenish

@RakholiyaJenishstr1.split()
jamylak

@jamylak string.split()bir seçenektir. Ben de regex ile yapılabilir olmadığını soruyordu?
Rakholiya Jenish

2
@RakholiyaJenish re.findallSeçeneği kullanamaz mısınız?
jamylak


7

Kullandığınızda re.splitve bölme deseni yakalama grupları içerdiğinde, gruplar çıktıda tutulur. Bunu istemiyorsanız, bunun yerine yakalamayan bir grup kullanın.


2
Örnekleme str.splitiçin kullanmak muhtemelen daha iyidir. Sadece senin neden bu davranışı aldığını anlatmak istedim.
BrenBarn

2

Aslında çok basit. Bunu dene:

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

2
Bunu + 1'leyecektim ama çirkin noktalı virgül kullanıyorsunuz.
jamylak

3
@jamylak Lol. Onları değiştireceğim. :) Java ve python kullanma alışkanlığı!
lanetleneceksin

1
@ GururajY.S. Sadece alan temelinde bölmek istiyorsanız, sadece kullanmalısınızstringToSplit.split()
lanet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.