2016-12-12 1 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 imこれは私が質問していた質問ではありません – LordZiggy

+2

"ユーザーのクエリにソリューションを見つける"ソリューションを見つける?あなたの質問は全く明確ではありません。ところで、あなたの正規表現はあなたが思うことをしません。 '[wet]'は、単語ではなく文字列中の 'w'、' e'または 't'文字を探します。あなたは正規表現を必要としなくても、単純にクエリーで ''濡れた ''をします。 – DeepSpace

答えて

2

正規表現はこれ用のツールではなく、間違って使用しています。 [wet]は 'w'、 'e'、または 't'と一致します。次のようにこのサンプルコードでやっている

は、はるかに簡単に表現することができる。もちろんin

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 

は、単語の境界をチェックしないので、これはshackedに一致するだろうが、それはすべきではありませんとにかくロジックは初歩的なので、使用しているキーワードに問題があります。

0

あなたの期待することはわかりません。 最初に、3つの文字w、e、またはtのいずれかがクエリ内にある場合、正規表現のドキュメントを見てください。[wet]は真です。これを試してみると、「湿った」と挿入するとほとんどすべての検索結果が真実になります(wは内部[水]、eは[画面] [ハッキング] [壊れた]などのように見えます) あなたの正規表現が「濡れていなければならない」という言葉全体を探します。「濡れていて」「欲しい」ではない場合は、「\ bwet \ 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"という名前を使用しないでください。 そして、あなたのIF-

一例(完璧ではないが、より多くのパターンに拡張することがより良い)を構築するためのいくつかのよりスマートな方法があります。

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 
関連する問題