2010-10-21 67 views
22

^(\s+)僅從第一行刪除空格。如何從所有行刪除前面的空格?Python:使用正則表達式從所有行中刪除空格

+0

空格包括換行符,這意味着如果在多行字符串中使用它,則所有內容都將在一行中結束。向我們展示一些意見,以便我們幫助理解這個問題! – rdrey 2010-10-21 05:42:27

+0

@rdrey:實際上,多行模式中的'^'與每個換行符後的*匹配,所以這不會成爲問題(除了「\ n \ n」)。看到我的答案。 – AndiDog 2010-10-21 05:47:33

+0

感謝您的更正。每天學習新東西:D – rdrey 2010-10-21 05:53:33

回答

24

Python的正則表達式模塊不會默認爲multi-line ^ matching ,所以你需要明確指定該標誌。

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" 

它也可能包括標誌內嵌到模式:

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

更簡單的方法是避免正則表達式,因爲原來的問題很簡單:

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

'「^ \ s +」'也會刪除空行 – 2017-04-11 16:27:19

6

你可以嘗試strip(),如果你想刪除正面和背面,或lstrip()如果前

>>> 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() 

如果你真的想用正則表達式

>>> 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()) 

沒有空格會像你問的一樣(一切都放在一個單詞中)。更有用的通常是加入一切與' ''\n'保持單獨的話。

0

你將不得不使用re.MULTILINE選項:

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

的 「(m)爲」 部分允許多。

8

@AndiDog在他的(當前接受的)答案中承認它咀嚼連續的換行符。

下面是如何解決這個缺陷,這是由於\n是兩個空格和一個行分隔符造成的。我們需要做的是重新構建一個只包含換行符以外的空白字符的類。

我們想要whitespace and not newline,它不能直接表示在一個重新類。我們將其重寫爲not not (whitespace and not newline)not(not whitespace or not not newline(謝謝,Augustus),即not(not whitespace or newline)[^\S\n]re表示法。

所以:

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

你實際上並不需要爲這個大部分時間正則表達式。如果你只希望多行刪除共同壓痕,嘗試textwrap模塊:

>>> import textwrap 
>>> messy_text = " grrr\n whitespace\n everywhere" 
>>> print textwrap.dedent(messy_text) 
grrr 
whitespace 
everywhere 

注意,如果壓痕是不規則的,這將維持:

>>> very_messy_text = " grrr\n \twhitespace\n everywhere" 
>>> print textwrap.dedent(very_messy_text) 
grrr 
     whitespace 
everywhere 
相關問題