2017-10-25 17 views
3

でフォーマットして文字列を埋めるには、私は辞書内の値で埋めるためのテンプレートを持っていると言う:Pythonの辞書

私はこのようなテンプレートがあります。このような辞書と

templates = [ 
    "I have four {fruit} in {place}", 
    "I have four {fruit} and {grain} in {place}", 
    ... 
] 

my_dict = {'fruit': ['apple', 'banana', 'mango'], 
      'place': ['kitchen', 'living room'], 
      'grain' : ['wheat', 'rice'] 
      } 

をこのような文があるとします:

sentence = "I have four apple in kitchen" 
私はその文を知りたいのですが、この文、テンプレート、辞書、 考える

は、いずれかのテンプレートに一致し、それはこのようにマッチした値を返します。

{'fruit': 'apple', 'place': 'kitchen'} 

をし、次のような上記の場合:

Input: "I have four apple and wheat in kitchen" 
Output: {'fruit': 'apple', 'grain': 'wheat', 'place': 'kitchen'} 

そして、それはあまりにもこれを扱うことができればそれは素晴らしいことだ:

Input: "I have four apple in bedroom" 
Output: {'fruit': 'apple'} 

お知らせは、それが唯一の寝室を以来する果物を返していません洗面所は場所の価値にない。

+1

あなた自身でこの問題を解決するために何をしましたか? –

+0

itertools.productを使用してすべての組み合わせを取得し、.format(** {組み合わせ})を使用して埋め込みますが、後でどのキーを入力するかわからない – user3613909

答えて

6
は、正規表現の中にあなたのフォーマットされた文字列を回し

import re 

words = {k: '(?P<{}>{})'.format(k, '|'.join(map(re.escape, v))) for k, v in my_dict.items()} 
patterns = [re.compile(template.format(**words)) for template in templates] 

これは、フォームI have four (?P<fruit>apple|banana|mango) in (?P<place>kitchen|living room)"のパターンを生成します。あなたは部分に合わせてテンプレートが必要な場合は

>>> import re 
>>> templates = [ 
... "I have four {fruit} in {place}", 
... "I have four {fruit} and {grain} in {place}", 
... ] 
>>> my_dict = {'fruit': ['apple', 'banana', 'mango'], 
...   'place': ['kitchen', 'living room'], 
...   'grain' : ['wheat', 'rice'] 
...   } 
>>> def find_matches(sentence): 
...  for pattern in patterns: 
...   match = pattern.match(sentence) 
...   if match: 
...    return match.groupdict() 
... 
>>> find_matches("I have four apple in kitchen") 
{'fruit': 'apple', 'place': 'kitchen'} 
>>> find_matches("I have four apple and wheat in kitchen") 
{'fruit': 'apple', 'grain': 'wheat', 'place': 'kitchen'} 

for pattern in patterns: 
    match = pattern.match(sentence) 
    if match: 
     matched_words = match.groupdict() 

これはまさに文に一致すると非常に高速で、O(N)のアプローチである:これらは、あなたの期待される出力を提供しますマッチング文章、(?...)グループのオプションパーツラップ:

"I have four {fruit} in (?{place})" 

や単語のLISに\w+を追加しますt(有効な単語に加えて)、一致後groupdict()の結果をmy_dictに対して検証します。 in bedroomの場合、\w+bedroomの部分に一致しますが、my_dictのリストには、たとえばplaceがありません。

+0

ありがとう!これはそれを解決しました。とても有難い – user3613909