2016-05-09 5 views
1
における正規表現文字

と単語全体置換を組み合わせる:は、だから私は、このような辞書を持っているのPython

corrections = {'L.C.M.':'LCM','L.C.M':'LCM'} 
sometext = 'L.C.M is cool but L.C.M. is not L.C.Mwhichshouldnotchange' 
expected = 'LCM is cool but LCM is not L.C.Mwhichshouldnotchange' 

私はLCMへの第一と第二を交換行う必要があるので、私は、このコード

for abbr,replace in corrections.items(): 
    pattern = r'\b' + re.escape(abbr) + r'\b' 
    sometext = re.sub(pattern, replace, sometext) 
を書きます

このコードは多少の作業が、

L.C.M. -> (Apply 1st replacement) -> LCM. (which is wrong) 
L.C.M. -> (Apply 2nd replacement) -> LCM (right) 

私は大きなリストを持っているので、私は馬鹿の証拠置換コードを必要としています代用する略語

+0

'パターンが= R '\ B' + re.escape(略称)+ R '(?= \ sの)'' –

答えて

0

重要なものはcorrections.items()の順です。この場合、corrections.items()は、L.C.Mであり、次にL.C.M.であり、これは秩序だった順序ではない。私の解決策は逆順でcorrectionsの項目をチェックすることです。逆辞書の注文は、L.C.M.となり、L.C.Mとなります。これを行うには、それはドットが続いているので、

rev_dict_items = sorted(list(corrections.items())) 
rev_dict_items.reverse() 
for abbr,replace in rev_dict_items: 
+0

このパターンにしてみてください私はあなたの、あまりにも働いていた、ソリューションの両方を試してみました。ありがとう:) –

0

for abbr,replace in corrections.items(): 

を交換する問題がここにL.C.M.のマッチングであり、あなたも\bを使用して単語の境界を適用しています。単語の境界は最後のドット(.)と一致しません。英数字が続くわけではないためです。

あなたが一致する文字列が空白以外の文字が続いていないことを確認するには、次のようにそれを行うことができます:

\b(L\.C\.M\.)(?!\S)

(?!\S)ここには、必ずあなたのことを確認します一致する文字列の後に空白以外の文字が続くことはありません。後に空白がある場合、または文字列の最後である場合は一致します。

IDEONE DEMO

+0

ありがとう、これは働いた:) –

+0

喜んで助けになる。 – AKS

関連する問題