2017-02-15 51 views
0

我有一大堆我正在嘗試清除的單詞。這些詞中的許多詞出現多次,每次都有點不同,我想對它們進行歸一化。比如我想換成下面的話:如果存在匹配的單詞,則替換整個字符串

list = ["resident super", "super live in", "on site superintendent in building", "livein super", "residential super", "superintendent lives in", "on-site super"...] 

只有superintendent

我想我可以用

for item in list: 
    re.sub("resident super|super live in|on site superintendent in building| livein super|residential super|superintendent lives in|on-site super", 
      "superintendent", list) 

做到這一點,但我肯定會錯過一些條目。所有的條目都包含單詞super,但有沒有一種方法可以制定正則表達式規則,用所需的單詞替換整個項目?

+0

的問題是,你要替換一個詞的空格分隔的單詞列表。所以你必須詳盡無遺,否則正則表達式不會知道何時開始/停止替換單詞。例如:「我是超人居住的人」:我在哪裏開始/停止替換? –

+0

如果您的「單詞」是逐行提供的,則可以通過簡單匹配\ bsuper \ b來替換整個字符串。 –

+0

我正在考慮使用'for'循環遍歷列表中的每個成員。如果該成員包含「super」這個詞,那麼整個成員應該由'superintendent'替代。 – Lukasz

回答

1

re.sub方法不會替換字符串。它不能,因爲Python中的字符串是不可變的。當您對字符串進行替換時,它將返回一個包含請求更改的新字符串(如果沒有匹配,則返回原始字符串)。您目前忽略了返回值,因此您的代碼無效。

但我不認爲你真的需要正則表達式來解決這個問題。如果您想更換以字符串"superintendent"提到這個詞super任何地方的任何字符串,你可以使用一個簡單的子測試:

for i, item in enumerate(list_of_strings): 
    if "super" in item: 
     list_of_strings[i] = "superintendent" 

這當然會更容易出現假陽性比使用當前的正則表達式。如果你想要的話,你仍然可以使用上述代碼的結構和正則表達式搜索(只需在將pattern設置爲與你想要的字符串匹配的正則表達式後將if "super" in item:行更改爲if re.search(pattern, item):)。

1

我不確定我是否理解你的問題,但是如果你想用superintendant替換super這個詞的每個元素,我會這樣做。

for index,element in enumerate(listToCheck): 
    if "super" in element: 
     listToCheck[index]="superintendant" 

順便說不要命名變量list,因爲它是一個保留的Python關鍵詞。

1

我可能會誤解你的問題,但是你不能用in代替嗎?這似乎並不需要正則表達式,因爲正則表達式要慢得多。

例如:

i=0 
while i < len(list): 
    if 'super' in list[i]: 
     list[i] = 'superintendant' 
    i+=1 

這將替換在列表中的一切,包括supersuperintendent

1

最短與列表理解:

lst = ["resident super", "super live in", "on site superintendent in building", 
"livein super", "residential super", "superintendent lives in", "on-site super", "mega-intendent"] 

new_lst = ['superintendent' if 'super' in item else item 
      for item in lst] 

print(new_lst) 
# ['superintendent', 'superintendent', 'superintendent', 'superintendent', 'superintendent', 'superintendent', 
# 'superintendent', 'mega-intendent'] 
相關問題