2015-11-15 48 views
0

我知道這個問題已經在不同版本中多次提出過,但是我沒有找到任何幫助我的東西。查找並替換字符串中的單詞

我有一個單詞列表:

arr = ["id",...] 

而且我有幾個字符串:

str = "my_id" 
str1 = "Id_number" 
str2 = "my_id_rocks" 
str3 = "my_idea" 

我試着去找到字符串中的單詞「ID」,把在爲大寫。但如果id是字符串中某個單詞的一部分,則不做任何事情。含義後,我申請的功能不適得到:

str = "my_ID" 
str1 = "ID_number" 
str2 = "my_ID_rocks" 
str3 = "my_idea" 

我不能假設對串話,某些字母可以是大寫字母,一些小寫。

到目前爲止,這是我有什麼,但是這也大寫idea => IDea我不想:

def words_to_upper(str): 
    words = ["id"] 
    for word in words: 
     if word in str.lower(): 
      replace_word = re.compile(re.escape(word), re.IGNORECASE) 
      str = replace_word.sub(word.upper(), str) 
      break 
    return str 

謝謝。

+0

@Delgan,爲什麼要刪除它?我需要大寫這個詞。 – MichaelR

+0

@Delgan,對不起我的錯誤,我當然需要把整個單詞大寫。我試圖在字符串中找到單詞「id」並將其轉換爲大寫。但如果「id」是單詞的一部分,則什麼也不做。 – MichaelR

+0

好的,對不起,我誤解了你的問題。 – Delgan

回答

1

我加入了[正則表達式]標籤,因爲你需要他們做這個(或最後,這是他們的目標,所以你最好使用它們而不是重新發明輪子)。

你所需要的關鍵詞是前瞻和回顧後,看到的this section

import re 

teststrs = ["my_id", "Id_number", "my_id_rocks", "my_idea"] 

replace_with_upper = "id" 

def toUpper(match): 
    return match.group(1).upper() 

for test_me in teststrs: 
    test_me = re.sub("(?<![a-z])({})(?![a-z])".format(replace_with_upper), toUpper, test_me, flags=re.IGNORECASE) 
    print(test_me) 

(?<![a-z])是負回顧後底:「如果這種模式的左匹配不匹配」。因此,如果"id"左側有一封信,則不匹配。這不會發生在您的示例中,但我認爲您也需要這種行爲。

(?![a-z])是負面看法:「不匹配,如果這種模式匹配在右邊」。這樣可以防止正則表達式與"my_idea"匹配,因爲向前看到"e"