2016-12-12 61 views
0

嗨,我目前正在處理查詢求解器代碼,我正在使用正則表達式來搜索用戶輸入查詢中的單詞。如何使用正則表達式來查詢查詢中的單詞?

但是我想到了我所使用的代碼並不是在平衡我最初想法的概念。代碼如下:

def query(): 
    print ('Enter a query\n\nThe query must not have more than 30 characters.\n') 
    while True: 
     query = raw_input ('Query: ') 
     if 30> len(query): 
      break 
      print ('The query must have less than 30 chracters.\n') 

def querysolver(): 
    query_words = dict.fromkeys(['screen_repair','Phone_virus','Water_damage', False]) 
    if re.search (r'[wet]', query): 
        query_words['Water_damage'] = True 
    if re.search (r'[water]', query): 
        query_words['Water_damage'] = True 
    if re.search (r'[wet]', query): 
        query_words['Water_damage'] = True 
    if re.search (r'[screen]', query): 
        query_words['screen_repair'] = True 
    if re.search (r'[smashed]', query): 
        query_words['screen_repair'] = True 
    if re.search (r'[hacked]', query): 
        query_words['Phone_virus'] = True 
    if re.search (r'[virus]', query): 
        query_words['Phone_virus'] = True 

然後,我將如何使用這些值來查找用戶查詢的解決方案?

+0

你有一個''一個如此break'之後print'永遠不會打印 – depperm

+0

@depperm即時對不起,這不是我問的問題 – LordZiggy

+2

「找到解決方案的用戶查詢」找到解決方案在哪裏?你的問題根本不明確。順便說一句,你的正則表達式不會做你認爲他們做的事。 '[wet]'在字符串中查找任何'w','e'或't'字符,而不是單詞。你甚至不需要正則表達式,只需在查詢中「溼」。 – DeepSpace

回答

2

正則表達式不是這個工具,而且你使用不正確。 [wet]將匹配'w','e'或't'。

你正在做這個代碼樣本中有什麼可以更容易地表述如下:

if 'wet' in query or 'water' in query: 
     query_words['Water_damage'] = True 
if 'screen' in query or 'smashed' in query: 
     query_words['screen_repair'] = True 
if 'hacked' in query or 'virus' in query: 
     query_words['Phone_virus'] = True 

當然in並不檢查字邊界,因此這將匹配shacked,但是這不應該是一個問題與您正在使用的關鍵字,因爲邏輯無論如何是基本的。

0

我不清楚你的期望。 首先:查看正則表達式的文檔,[wet]是真的,如果三個字母之一w,e或t在查詢內。如果你嘗試這個,你會看到,如果你插入「wet」,幾乎所有的搜索都是真實的(w在水裏面,e在屏幕裏面[被黑] [被砸]等等 如果你想查找整個單詞的正則表達式必須是「溼」。如果你只是想「溼」,而不是「anywetthing」你可以用「\ bwet \ b」,因爲「\ b」上的斷字相匹配。

但也有一些問題更多:你想你的輸入發送到計算(「querysolver」)要通過一個變量「查詢」你有一些問題,這樣做怎麼辦

你可以這樣做:

import re 
def query(): 
    print ('Enter a query\n\nThe query must not have more than 30 characters.\n') 
    while True: 
     query = raw_input ('Query: ') 
     print len(query), query 
     if 30 < len(query): 
      print ('The query must have less than 30 chracters.\n') 
      break 
     else: 
      print querysolver(query) 


def querysolver(query): 
    query_words = dict.fromkeys(['screen_repair','Phone_virus','Water_damage', False]) 
    if re.search (r'wet', query): 
        query_words['Water_damage'] = True 
    if re.search (r'water', query): 
        query_words['Water_damage'] = True 
    if re.search (r'wet', query): 
        query_words['Water_damage'] = True 
    if re.search (r'screen', query): 
        query_words['screen_repair'] = True 
    if re.search (r'smashed', query): 
        query_words['screen_repair'] = True 
    if re.search (r'hacked', query): 
        query_words['Phone_virus'] = True 
    if re.search (r'virus', query): 
        query_words['Phone_virus'] = True 
    return query_words 

query() 

,但不應該使用名稱「query」作爲函數和輸入字符串。 而且有你如果 - 一些更聰明的方法構建

一個例子(不完美,但更好地擴展到更多的模式):

def querysolver2(query): 
    query_words = dict.fromkeys(['screen_repair','Phone_virus','Water_damage']) 
    for pattern in ['wet','water']: 
     pattern = r'\b'+pattern+r'\b' 
     if re.search(pattern,query): 
      query_words['Water_damage'] = True 
    for pattern in ['screen','smashed']: 
     pattern = r'\b'+pattern+r'\b' 
     if re.search(pattern,query): 
      query_words['screen_repair'] = True 
    for pattern in ['hacked','virus']: 
     pattern = r'\b'+pattern+r'\b' 
     if re.search(pattern,query): 
      query_words['Phone_virus'] = True 
    return query_words