2015-02-06 184 views
1

我有一個像下面字符串中的一個單詞替換單詞

word_dict = {'a': 'a1', 'winter': 'cold', 'summer': 'hot'} 

,我有一個字符串,像這樣的詞典:

data = "It's winter not summer. Have a nice day" 

我想要做的是替換詞a by a1,winter by cold等在data。我曾嘗試使用下面的代碼:

for word in word_dict: 
    data = data.replace(word, word_dict[word]) 

但由於它替代了子(在data,不是單詞的子串)失敗。事實上,單詞HaveHa1ve取代。

結果應該是:

data = "It's cold not hot. Have a1 nice day" 
+0

想要正則表達式和'\ b'(=單詞邊界ary)的東西。 – georg 2015-02-06 10:37:21

回答

4

你可以使用re.sub\b單詞字符與非單詞字符匹配的單詞邊界。我們需要用字邊界匹配一個確切的詞串或以其他方式,就在也匹配aday

>>> word_dict = {'a': 'a1', 'winter': 'cold', 'summer': 'hot'} 
>>> data = "It's winter not summer. Have a nice day" 
>>> for word in word_dict: 
     data = re.sub(r'\b'+word+r'\b', word_dict[word], data) 


>>> data 
"It's cold not hot. Have a1 nice day" 
+0

是的!有用!!謝謝 – 2015-02-06 10:44:11

1

有多種方式來實現這一目標,除了正則表達式:

ldata = data.split(' ') #splits by whitespace characters 
res = [] 
for i in ldata: 
    if i in word_dict: 
     res.append(word_dict[i]) 
    else: 
     res.append(i) 
final = ' '.join(res) 

正則表達式解決方案更實用,並且符合您的需求,但list.split()和string.join()方法有時候會派上用場。 :)

+1

使用.keys是不需要和效率低下。只需在word_dict中使用 – 2015-02-06 10:52:11

+0

謝謝,我解決了它。 :) p.s.你能否提供任何參考/解釋它的低效率?我聽說過,但不知道實際的原因。 :) – 2015-02-06 10:55:42

+1

python 2你建立一個列表並做一個線性掃描,因此它變成了一個'0(n)'操作而不是0(1),在python 3中你有一個額外的函數調用創建一個dictview – 2015-02-06 10:58:53

0

可以使用join()函數內部發電機:

>>> word_dict = {'a': 'a1', 'winter': 'cold', 'summer': 'hot'} 
>>> data = "It's winter not summer. Have a nice day" 
>>> ' '.join(word_dict[j] if j in word_dict else j for j in data.split()) 
"It's cold not summer. Have a1 nice day" 

與分裂,你可以在它的詞進行搜索,那麼用一個簡單的理解,以取代具體詞的數據。

1

與dict.get和分裂的" "使用拆分,以保持適當的間距:

from string import punctuation 

print(" ".join([word_dict.get(x.rstrip(punctuation), x) for x in data.split(" ")])) 
It's cold not hot. Have a1 nice day 

我們還需要剝去標點符號等等summer.比賽summer等等

一些計時顯示,即使分裂和剝離非正則表達式的方法仍然快兩倍:

In [18]: %%timeit                data = "It's winter not summer. Have a nice day" 
for word in word_dict: 
     data = re.sub(r'\b'+word+r'\b', word_dict[word], data) 
    ....: 
100000 loops, best of 3: 12.2 µs per loop 

In [19]: timeit " ".join([word_dict.get(x.rstrip(punctuation), x) for x in data.split(" ")]) 
100000 loops, best of 3: 5.52 µs per loop 
+1

非常好用的dictionary.get默認值。 :d – 2015-02-06 11:01:21

相關問題