2010-11-11 68 views
10

在Python中,在另一個字符串中查找字符串的優雅方法是什麼,但只有當子字符串在整個單詞中,而不是單詞的一部分時纔有效?在字符串中查找子字符串,但僅限於整個單詞?

也許一個實例證實了我的意思:

string1 = "ADDLESHAW GODDARD" 
string2 = "ADDLESHAW GODDARD LLP" 
assert string_found(string1, string2) # this is True 
string1 = "ADVANCE" 
string2 = "ADVANCED BUSINESS EQUIPMENT LTD" 
assert not string_found(string1, string2) # this should be False 

我怎樣才能最好編寫一個名爲string_found,會做什麼,我需要的功能?我想我或許能有這樣的事情掰過來:

def string_found(string1, string2): 
    if string2.find(string1 + " "): 
     return True 
    return False 

但是,這並不感到很優雅,也將不匹配字符串1,如果它是在字符串2月底。也許我需要一個正則表達式? (argh正則表達式恐懼)

回答

5

這裏有一種方法可以在沒有正則表達式的情況下(按照要求)假設您想要任何空格作爲分隔符。

import string 

def find_substring(needle, haystack): 
    index = haystack.find(needle) 
    if index == -1: 
     return False 
    if index != 0 and haystack[index-1] not in string.whitespace: 
     return False 
    L = index + len(needle) 
    if L < len(haystack) and haystack[L] not in string.whitespace: 
     return False 
    return True 

而且這裏的一些demo code(鍵盤是一個偉大的想法:感謝菲利克斯克林提醒我)

+0

不客氣:) – 2010-11-11 14:20:45

+0

只要確保「保存」鍵盤粘貼,以便它們不會過期。 (我包括一個鏈接回到鍵盤評論,稍後也是我自己的筆記。) – 2010-11-13 07:27:07

+1

對於那些希望確保標點符號和空白符號被認爲是有效的整個單詞分隔符的人...將上面的代碼修改爲如下: '''不在(string.whitespace + string.punctuation)''' 也注意這個函數的效率是RegEx替代方案的兩倍多,所以......如果你使用它很多,這個功能是要走的路。 – 2017-04-17 18:52:06

19

你可以(通過我的高亮顯示)使用regular expressions和單詞邊界特殊字符\b

匹配空字符串,但只匹配單詞的開頭或結尾。一個單詞被定義爲一個字母數字或下劃線字符序列,所以單詞的末尾用空格或非字母數字,非下劃線字符表示。請注意,\b定義爲\w\W之間的邊界,因此被視爲字母數字的精確字符集取決於UNICODELOCALE標誌的值。在字符範圍內,\b表示退格字符,以便與Python的字符串文字兼容。

def string_found(string1, string2): 
    if re.search(r"\b" + re.escape(string1) + r"\b", string2): 
     return True 
    return False 

Demo


如果字邊界是隻爲你空格,你也可以擺脫前和空格附加到你的字符串:

def string_found(string1, string2): 
    string1 = " " + string1.strip() + " " 
    string2 = " " + string2.strip() + " " 
    if string2.find(string1): 
     return True 
    return False 
+1

提出理論建議。你的劇本OTOH將無法使用。 ''\ b''是退格符(''\ x08'')的轉​​義序列。我建議'r'\ b%s \ b'%(re.escape(string1))'代替're.search()'的第一個參數。實際上,整個函數可以簡化爲'return re.search(r'\ b%s \ b'%(re.escape(string1)),string2)不是None' – Walter 2010-11-11 13:59:46

+1

@Walter: B'。據說:*在**字符範圍**內,'\ b'表示退格字符,... *至少適用於我。但是,字符串替換也不錯:) – 2010-11-11 14:06:18

+0

當\ b在字符範圍[a-z0-9 \ b] ...內時? \ b應該能夠工作,並且在我進行的非常簡短的測試中做了 – 2010-11-11 14:07:08

0

一種方法使用re或正則表達式,應完成此任務的模塊是:

import re 

string1 = "pizza pony" 
string2 = "who knows what a pizza pony is?" 

search_result = re.search(r'\b' + string1 + '\W', string2) 

print(search_result.group())