2017-02-06 42 views
0

讓說我有以下列表
['Y M C A','cambridge m a','d m v office','t mobile']
,並希望將其轉換爲
['YMCA','cambridge ma','dmv office','t mobile']如何使用再找到一個大名單

是檢測連續的空格分隔每個項目的單個字符所有連續的單個字符後跟單個不同長度的空間(大於兩個)。例如,項目'd m v office',我們應該檢測**'d m v'**並將其轉換爲**'dmv'**,但會保留't mobile store'完整(只有一個單個字符)。

我知道我可以循環瀏覽列表,按空格分割每個項目並查找單個字符項目,但聽起來不太有效。是否有可能使用正則表達式和模塊re?再次連續的圖案可以是任何長度的,大於1

回答

1

下面應該工作:

import re 

def trim_match_spaces(matchObj): 
    return ''.join(matchObj.group(0).split()) 

templist = ['Y M C A', 'cambridge m a', 'd m v office', 't mobile', 'cambridge m a is far from the sun'] 

for index, word in enumerate(templist): 
    templist[index] = re.sub(r'(\b(\w\s)+\w\b)', trim_match_spaces, word) 

print templist 

這版畫

['YMCA', 'cambridge ma', 'dmv office', 't mobile', 'cambridge ma is far from the sun'] 
0

使用正則表達式sub作品對我來說:

text = 'd m v office' 
out = re.sub(r'(.) (.)(?:\s+|$)',r'\1\2',text) 
print(out) #<-- prints 'dmv office' 

第一個參數是要匹配的模式,其中有3個捕獲組,第一組其中兩個是(.) (.),它們匹配由空格分隔的單個字符。 (?:\s+|$)匹配空格或字符串的結尾。第二個參數表示用前兩個捕獲組替換命中,第三個參數是文本輸入。

+0

如果間隔出的文本位於字符串的中間位置,例如「劍橋人遠離太陽」? – asongtoruin

+0

啊你是對的,它不適用於這個例子,我會努力修復它 – mitoRibo