2015-05-21 17 views
3

this鏈接我用下面的代碼:與re.match匹配字符串不起作用

my_other_string = 'the_boat_has_sunk' 
my_list = ['car', 'boat', 'truck'] 
my_list = re.compile(r'\b(?:%s)\b' % '|'.join(my_list)) 
if re.search(my_list, my_other_string): 
    print('yay') 

但是它不工作。我試着打印re.compilemy_list,它打印此:

re.compile('\\b(?:car|boot|truck)\\b') 

我在做什麼錯?

編輯:

我不能_分裂的話,因爲我總是不知道什麼樣的字符串將出席。所以,如果列表中的一個單詞在字符串中,那麼它必須是真的,而不是單獨的單詞。

編輯2: 更改爲re.search

+0

使用're.search'。 [re.match](https://docs.python.org/2/library/re.html#re.match): *如果字符串的開頭**處的零個或多個字符**與正則表達式模式匹配,返回一個相應的MatchObject實例。如果字符串與模式不匹配,則返回None;請注意,這與零長度匹配不同* –

+0

@stribizhev,它返回相同的結果。 – user3605780

+0

然後請顯示足夠的代碼來重現問題。 –

回答

3

這不是一個普通的句子,其中的單詞用下劃線連接。因爲你只是檢查,如果詞存在,你既可以去除\b(因爲它是匹配一個字邊界上和_就是一個字字符!)或者添加替代:

import re 
my_other_string = 'the_boat_has_sunk' 
my_list = ['car', 'boat', 'truck'] 
my_list = re.compile(r'(?:\b|_)(?:%s)(?=\b|_)' % '|'.join(my_list)) 
if re.search(my_list, my_other_string): 
    print('yay') 

IDEONE demo

編輯

既然你說它必須是真實的,如果列表中的一個關鍵詞是字符串中,不僅作爲一個單獨的詞,但它musn't匹配如果例如船屋是字符串中,我建議先用空間代替非單詞字符和_,然後使用您有相關\b正則表達式:

import re 
my_other_string = 'the_boathouse_has_sunk' 
my_list = ['car', 'boat', 'truck'] 
my_other_string = re.sub(r'[\W_]', ' ', my_other_string) 
my_list = re.compile(r'\b(?:%s)\b' % '|'.join(my_list)) 
if re.search(my_list, my_other_string): 
    print('yay') 

這不會打印yay,但如果你刪除house,它會。

請參閱IDEONE Demo 2

+0

我想現在應該更清楚了。隨意問你是否需要更多的幫助。 –

+0

感謝這工作! – user3605780

+0

我應該更清楚地考慮它,因爲如果例如船庫在繩子中,它就不匹配。所以我需要刪除所有特殊字符。我是否正確,我必須用|分割這些?如果是這樣,我該如何刪除'|'? – user3605780

5

re.match只匹配正則表達式的輸入字符串的開頭。所以這隻適用於字符串從my_list開始的字符串。

re.search另一方面搜索整個字符串以匹配正則表達式。

import re 

my_list = ['car', 'boat', 'truck'] 
my_other_string = 'I am on a boat' 

my_list = re.compile(r'\b(?:%s)\b' % '|'.join(my_list)) 
if re.search(my_list, my_other_string):#changed function call here 
    print('yay') 

對於字符串「我在船上」re.match將失敗,因爲該字符串的開頭是「我」不匹配正則表達式。 re.search也不會匹配第一個字符,但會通過字符串,直到它到達「船」,在這一點上它將找到一個匹配。

如果我們改用字符串「船是我對什麼是」re.matchre.search都將匹配正則表達式的字符串,因爲該字符串現在比賽開始。