2013-07-23 14 views
1

我有一個長字符串,其中包含\ n,\ r,\ t和空格之間的單詞和其他字符之間的各種組合。從Python中的給定字符串中刪除奇 n, t, r和空格組合

  • 我想減少所有多個空間到一個空間。
  • 我想將所有\ n,\ r,\ t組合減少爲單個換行符。
  • 我想將所有\ n,\ r,\ t和空間組合縮減爲單個換行符。

我試過''.join(str.split())以各種方式沒有成功。

  • 什麼是正確的Pythonic方式?

  • Python 3.x的解決方案會不同嗎?

Ex。串:

ex_str = u'Word \n \t \r \n\n\n word2 word3 \r\r\r\r\nword4\n word5' 

希望的輸出[新新行= \ N]:

new_str = u'Word\nword2 word3\nword4\nword5' 
+0

不要命名變量'str';它掩蓋了內置的類型。 –

+0

_「我想將所有\ n,\ r,\ t和空間組合縮減爲單個換行符。」_行中的兩個空格計算爲「\ n,\ r,\ t和空間組合「?如果是這樣,你如何決定何時使用這條規則,以及何時使用第一條規則? – Kevin

+0

@Kevin,中間詞,我有任何東西從單個\ n,單個\ t,單個\ r,單個空間到任何(或相同)的1,2,3或全部4個。如果任何組合有一條或多條新線,我希望它成爲一條新線。如果它只有空格(一個或多個),我希望它是一個空格。 – Phil

回答

5

使用上的所有空白的組合str.splitlines()和分割用str.split()

'\n'.join([' '.join(line.split()) for line in ex_str.splitlines() if line.strip()]) 

此將每個刪除空行,然後將每行的所有空白摺疊爲單個空格。

假設輸入是一個Python 3字符串,相同的解決方案適用於兩個Python版本。

演示:

>>> ex_str = u'Word \n \t \r \n\n\n word2 word3 \r\r\r\r\nword4\n word5' 
>>> '\n'.join([' '.join(line.split()) for line in ex_str.splitlines() if line.strip(' ')]) 
u'Word\nword2 word3\nword4\nword5' 

要保留的選項卡,你需要脫掉衣服,在只是空間分割,並篩選出空字符串:

'\n'.join([' '.join([s for s in line.split(' ') if s]) for line in ex_str.splitlines() if line.strip()]) 

演示:

>>> '\n'.join([' '.join([s for s in line.split(' ') if s]) for line in ex_str.splitlines() if line.strip(' ')]) 
u'Word\n\t\nword2 word3\nword4\nword5' 
+0

很好:) .. – TerryA

+0

如果是'\ t \ t',這可能不滿足需求3。它應該換成換行符。 @Martijn Pieters – zhangyangyu

+0

@張揚餘:我不是100%相信是這樣。 –

-1
'\n'.join(str.split()) 

輸出:

u'Word\nword2\nword3\nword4\nword5' 
+1

仔細查看預期的輸出;) – TerryA

+0

用'換行符替換'word2'和'word3'之間的間距。 –

+0

是的。剛剛閱讀= [ –

2

使用簡單的正則表達式:

import re 
new_str = re.sub(r'[^\S\n]+', ' ', re.sub(r'\s*[\n\t\r]\s*', '\n', ex_str)) 
0

使用正則表達式:

>>> s 
u'Word \n \t \r \n\n\n word2 word3 \r\r\r\r\nword4\t word5' 
>>> re.sub(r'[\n\r\t ]{2,}| {2,}', lambda x: '\n' if x.group().strip(' ') else ' ', s) 
u'Word\nword2 word3\nword4\nword5' 
>>> 
0

使用正則表達式將取代標籤用空格u'word1\t\tword2',或者你真的另一個解決方案要還在這裏添加換行符?

import re 
new_str = re.sub(r"[\n\ ]{2,}", "\n", re.sub(r"[\t\r\ ]+", " ", ex_str))