2010-10-21 17 views
22

^(\s+) sadece boşlukları ilk satırdan kaldırır. Tüm boşluklardan ön boşlukları nasıl kaldırabilirim?Python: Beyaz boşluğu tüm satırlardan kaldırmak için düzenli ifadeyi kullanın

geri ön kaldırmak istiyorsanız ve eğer strip() deneyebilirsiniz
+0

boşluk satır karakterleri içerir, Bu, çok satırlı bir dizede kullanırsanız, her şeyin tek bir satırda sona ereceği anlamına gelir. Bize biraz giriş göster, böylece soruyu anlamaya yardımcı olabiliriz! – rdrey

+0

@rdrey: Aslında, '^' çok satırlı modda * her yeni satırın * ile eşleşir, bu nedenle sorun olmaz ("\ n \ n" dışında). Cevabımı gör. Bu düzeltme için – AndiDog

+0

teşekkürler. Her gün yeni bir şeyler öğrenmek: D – rdrey

cevap

24

Python'un regex modülü multi-line ^ matching varsayılan olarak değil kullanmak istiyorsanız bu yüzden bu bayrağı açıkça belirtmelisiniz. Orijinal sorun çok basittir çünkü

re.sub(r"(?m)^\s+", "", "a\n b\n c") 

daha kolay bir çözüm düzenli ifadeler kaçınmaktır:

r = re.compile(r"^\s+", re.MULTILINE) 
r.sub("", "a\n b\n c") # "a\nb\nc" 

# or without compiling (only possible for Python 2.7+ because the flags option 
# didn't exist in earlier versions of re.sub) 

re.sub(r"^\s+", "", "a\n b\n c", flags = re.MULTILINE) 

# but mind that \s includes newlines: 
r.sub("", "a\n\n\n\n b\n c") # "a\nb\nc" 

O desenine bayrak inline dahil etmek mümkündür

content = 'a\n b\n\n c' 
stripped_content = ''.join(line.lstrip(' \t') for line in content.splitlines(True)) 
# stripped_content == 'a\nb\n\nc' 
+0

'^^+' 'ayrıca boş satırları kaldırır –

6

veya lstrip() eğer ön

>>> s=" string with front spaces and back " 
>>> s.strip() 
'string with front spaces and back' 
>>> s.lstrip() 
'string with front spaces and back ' 

for line in open("file"): 
    print line.lstrip() 

gerçekten Regex

>>> import re 
>>> re.sub("^\s+","",s) # remove the front 
'string with front spaces and back ' 
>>> re.sub("\s+\Z","",s) 
' string with front spaces and back' #remove the back 
1
nowhite = ''.join(mytext.split()) 

Herhangi bir boşluk, istediğiniz gibi olmayacaktır (her şey tek kelimedir). Daha yararlı olağan, kelimeleri ayrı tutmak için ' ' veya '\n' ile her şeye katılmanızdır.

0

Sen re.MULTILINE seçeneği kullanmak gerekecek:

re.sub("(?m)^\s+", "", text) 

"(? M)" kısmı satırlı sağlar.

8

@AndiDog, (şu anda kabul edilen) yanıtında ardışık yeni satırlar bulunduğunu kabul eder.

\n BOTH beyaz boşluk ve satır ayırıcısı olduğu gerçeğinden kaynaklanan bu eksikliğin nasıl giderileceği aşağıda açıklanmıştır. Yapmamız gereken şey, yeni satır dışındaki yalnızca beyaz karakterleri içeren bir yeniden sınıf oluşturmaktır.

Doğrudan bir sınıfta ifade edilemeyen whitespace and not newline istiyoruz. , yani not(not whitespace or not not newline (teşekkürler, Augustus), yani not(not whitespace or newline) no., re notasyonunda yeniden yazalım. Yani

:

>>> re.sub(r"(?m)^[^\S\n]+", "", " a\n\n \n\n b\n c\nd e") 
'a\n\n\n\nb\nc\nd e' 
0

Aslında bu zaman çoğu için normal ifadeleri gerekmez. Yalnızca birden fazla satır boyunca ortak girinti kaldırmak için arıyorsanız, textwrap modülü deneyin:

girinti düzensiz ise, bu muhafaza edeceğini
>>> import textwrap 
>>> messy_text = " grrr\n whitespace\n everywhere" 
>>> print textwrap.dedent(messy_text) 
grrr 
whitespace 
everywhere 

Not:

>>> very_messy_text = " grrr\n \twhitespace\n everywhere" 
>>> print textwrap.dedent(very_messy_text) 
grrr 
     whitespace 
everywhere 
İlgili konular