2014-03-06 77 views
1

我有一個單詞列表(即使2個或3個單詞在1個對象中)。我編譯了一個正則表達式,將列表中的任何單詞匹配到一個隨機字符串。如果匹配,則返回該列表的該對象,否則它將對該字符串執行另一個正則表達式以返回表達式。
我的代碼:
「佈局」是單詞列表,「layout_re」使用列表中的單詞匹配字符串「str」。如果ms存在於列表中,則返回ms,否則使用p的表達式返回該模式。檢查正則表達式結果在列表中,if-else python

def layout_corr(str): 

    ms = layout_re.search(str) 
    if ms in layouts: 
     ms=ms 

    else: 
     p = re.compile(r'(?:\w+\s+){1,2}layout') 
     ms = re.findall(p,str) 
    return ms 

我得到的輸出是else語句的輸出。
例如: - str = " no 804 8th main 2nd c cross hrbr layout 1st block"
該列表包含「hrbr佈局」,因此必須返回hrbr佈局。但相反,該函數返回"cross hrbr layout"這是由else聲明計算的毫秒。if語句有什麼問題?

+1

're.search'返回'match'對象(或'None'),而're.findall'返回'list'。兩者都不會返回純粹匹配的對象。 –

回答

1

re.search返回匹配的對象,而不是字符串,使:

ms in layouts 

將始終返回false。改爲:

def layout_corr(str): 
    ms = layout_re.search(str) 
    if ms: 
     return ms.group()  
    else: 
     p = re.compile(r'((?:\w+\s+){1,2})layout') 
     ms = re.findall(p,str) 
     return ms 
+0

如果你想修剪空格,你可以使用'(\ w +(?:\ s + \ w +)?)\ s + layout'作爲第二個正則表達式。 – Jerry

+0

另外,你應該避免使用'str',因爲它是一個函數名(已經在聊天中告訴你,但在這裏也提到它) – Jerry

0

1)改變ms=msreturn ms

2)爲了 「捕捉」 的字符串"hrbr layout" - 改變線:

p = re.compile(r'(?:\w+\s+){1,2}layout') 

到:

p = re.compile(r' (\w+? layout)') 

演示:

p = re.compile(r' (\w+? layout)') 
ms = re.findall(p,"no 804 8th main 2nd c cross hrbr layout 1st block") 
print(ms[0]) // prints: "hrbr layout" 
+0

hrbr在列表中。如果我使用這個表達式,那麼它會在總是佈局之前提取1個字。我想要的是檢查名爲「佈局」的列表中的存在,並返回相同的,如果存在的話。如果不存在,則返回佈局前的2個單詞.. Hrbr是在佈局列表中,所以我希望第1條語句返回exprssion –

+0

@Sword在這種情況下更改'ms = ms'到'return ms' – alfasin

+0

你可以編輯你的答案?? –