2016-06-16 19 views
0
text = "One sentence with one (two) three, but mostly one. And twos." 

所望の結果を単語を交換:A sentence with A (B) C, but mostly A. And twos.辞書に正確に一致することにより、文字列に

言葉はlookup_dictの正確な一致に応じて交換する必要があります。したがって、2つのの2つのは、単語に追加の文字があるため、置き換えてはいけません。スペース、カンマ、小括弧、ピリオドの隣の単語は置き換えてください。

lookup_dict = {'var': ["one", "two", "three"]} 
match_dict = {'var': ["A", "B", "C"]} 

var_dict = {} 

for i,v in enumerate(lookup_dict['var']): 
    var_dict[v] = match_dict['var'][i] 
    xpattern = re.compile('|'.join(var_dict.keys())) 
    result = xpattern.sub(lambda x: var_dict[x.group()], text.lower()) 

結果:A sentence with A (B) C, but mostly A. and Bs.

私は辞書に単語+隣接する文字のすべての組み合わせを追加することなく、所望の出力を達成することはできますか?これは、不必要に複雑なようだ:

lookup_dict = {'var':['one ', 'one,', '(one)', 'one.', 'two ', 'two,', '(two)', 'two.', 'three ', 'three,', '(three)' 'three.'] 
... 
result = xpattern.sub(lambda x: var_dict[x.group()] if x.group() in lookup_dict['var'] else x.group(), text.lower()) 
+0

単語境界の使用を検討しましたか? –

+0

'one'、' two'などが非単語の文字で始まったり、終わったりする場合は、単語の境界ではなく、見た目に行きます。 '' var_dict.keys()])+ r '')の中のxに対して、 'xpattern = re.compile(?"(?<!\ w) ?!\ w) ")' –

答えて

3
w = "Where are we one today two twos them" 
lookup_dict = {"one":"1", "two":"2", "three":"3"} 
pattern = re.compile(r'\b(' + '|'.join(lookup_dict.keys()) + r')\b') 
output = pattern.sub(lambda x: lookup_dict[x.group()],w) 

これは基本的に、

私は、各エントリのキーを使用するように辞書を更新

「我々は彼ら補数1今日2されている場合は」プリントアウトします。

正規表現\ b(すべての|キー|あなたの辞書)\ bを使用して項目a、b、cに一致する正規表現を作成しました。単語の一部ではないものにマッチする単語境界を使用します。すなわち、スペース、脱字など

は、次にパターンを使用して、

+1

私は、重要なテイクアウェイメッセージは単語境界文字として '\ b'を使うことだと思います。なぜあなたはそれについてちょっと精緻化しないのですか? –

+0

申し訳ありません。 – engineer14

0

[OK]をが最終的に解決策を終え発生したすべての一致を置き換え!それは超冗長で、私はそれが私の子供を育てることはできませんが、ここにそれはとにかくです。

それはあなたが本当に欲しいもののように見えます
lookup_dict = {"one": "A", "two": "B", "three": "C"} 

単語全体を一致させることです:他の答えは、おそらくより良いソリューション:)

まずあなたがその代替と交換したい単語を表現するためのより良い方法がありますです句読点や大文字小文字を無視します。そのために、我々は文字列から、我々はそれを一致しようとするたびに句読点を除去した後、文字で元の単語を再構築する「」ではなく「1」のできる、など

import re 

text = "One sentence with one (two) three, but mostly one. And twos." 

lookup_dict = {"one": "A", "two": "B", "three": "C"} 

# Make a regex for only letters. 
regex = re.compile('[^a-zA-Z]') 

textSplit = text.split() 

for i in range(0, len(textSplit)): 
    # Get rid of punctuation. 
    word = regex.sub('', textSplit[i]).lower() 
    if word in lookup_dict: 
     # Fetch the right letter from the lookup_dict. 
     letter = lookup_dict[word] 
     # Find where the word is in the punctuated string (super flakey I know). 
     wInd = textSplit[i].find(word) 
     # Just making sure the word needs to be reconstructed at all. 
     if wInd != -1: 
      # Rebuilding the string with punctuation. 
      newWord = textSplit[i][0:wInd] + letter + textSplit[i][wInd+len(word):] 
      textSplit[i] = newWord 

print(" ".join(textSplit)) 

ない優れたソリューションI知っているが、私はそれを押し進めた。ちょっと楽しんでみてください。

+1

大文字と小文字を区別しない置換を使用するとよい点があります。 – engineer14

+0

私の正規表現はちょっと錆びています(存在しないことを見てください)ので、私はちょうど基本と一緒に作業しました。 :) –

関連する問題