2

文字列で使用されている略語を実際の句の等価物に置き換えて、文字列を正規化しようとしています。「dict」という名前のpython辞書に、そのような略語のリストがあります。例えば:

print dict['gf']

次のようになります。

girlfriend

さて、私の質問は、このディクショナリには約 300 個のキーがあるため、これらのキーのいずれかが特定の文字列に含まれているかどうかをすばやく確認する方法が必要だということです。私の最初の考えは、次の正規表現を使用してから、辞書のすべてのキーを特定の文字列(コードでは「テキスト」と名付けました)のすべての単語と照合して比較しようとすることでしたが、気づきました文字列の途中に変数を配置することはできません。

import re
text = "I have a gf"
print re.sub (r'(?<![a-zA-Z])(gf)(?![a-zA-Z])', 'girlfriend', text)

これは次のように表示されます。

I have a girlfriend

しかし、お気づきのように、上記のケースにこの方法を適用することはできません。誰でもこれで私を助けることができますか?前もって感謝します!

4

2 に答える 2

2

辞書のメソッドを使用し.get()て、略語を検索できます。によって返されるデフォルト値は.get()ですNoneが、ルックアップが失敗したときに使用される引数を指定できます。したがって、辞書を.get(s, s)調べてs、辞書にsない場合はそのまま返し、辞書にある場合は辞書の値を返します。

次に、文字列を分割し、各単語を検索して再結合します。

abbrevs = { "gf" : "girlfriend", "cul" : "see you later" }

def lookup(s):
    return abbrevs.get(s, s)

def expand(s_text):
    return ' '.join(lookup(s) for s in s_text.split())

print(expand("My gf just called.  cul"))

上記は空白の単語のみを分割し、すべての空白を単一のスペースに置き換えます。空白や句読点に一致する正規表現を記述し、それを使用してより巧妙な分割関数を作成し、一致した空白を保存して、すべての空白を単一のスペースに置き換えないようにすることができます。しかし、私は例を単純にしたいと思っていました。

于 2012-12-25T07:36:20.083 に答える
2

一度にすべての単語に一致する正規表現を作成する方法を次に示します。

words = {
    'gf': 'girlfriend',
    'bf': 'boyfriend',
    'btw': 'by the way',
    'hi': 'hello',
}

pat = re.compile(r"\b(%s)\b" % "|".join(words))

text = "The gf and the bf say hi btw."

new_text = pat.sub(lambda m: words.get(m.group()), text)

print new_text

版画:

The girlfriend and the boyfriend say hello by the way.
于 2012-12-25T12:00:14.023 に答える