0

私は単一の文字b、c、dを持っています....辞書と正規表現ライブラリのre.subおよびmultiple_replace関数を使用してランダムな単語に置き換えました。つまり、b = 本、c = 料理人、d = ドゥークなど.

ただし、bb、cc、または dd の繰り返しがある場合... 代わりに、これらの文字を別のものとして出力できるようにしたいのですが、すべての 2 文字が bb= blah、cc = blah のような 1 つの単語に相当します。 , dd= blah の後に文字が続きます。したがって、bb=blahb、cc=blahc、dd=blahd です。

どうやってやるの?

私が試してみました:

print multiple_replace(dict, re.sub(r'([bcdfghjklmnpqrstvwxyz])\1', r'science\1', text,   flags = re.I)) 

ここで、dict は単語 b= book、c= cook、d=dook などを含む辞書です。

re.sub 機能には、母音以外のすべての二重文字が含まれており、科学という単語とその文字に置き換えられます。テキストは、辞書内で見つかった文字列置換に変換したい入力文字列を表します。

したがって、出力を bb =scienceb, cc=sciencec にしたいのですが、現在抱えている問題は、文字列「science」を出力する代わりに、必要なことです。辞書内で見つかった単語 Science の文字列置換を出力します。たとえば、"s" : "sook"、"c" : "cook"、"i" : "i"、"n" : "nook"、

そのため、テキスト文字列の sookcookiecooknooke に置き換えられる 2 文字の単語が出力されます。何故ですか?どうすれば修正できますか?

混乱している場合は、お知らせください。どうもありがとう!

編集:

ここに私が取り組んでいるコードがあります:

import re 

def multiple_replace(dict, text): 
    # Create a regular expression  from the dictionary keys
    regex = re.compile("(%s)" % "|".join(map(re.escape, dict.keys())))
    # For each match, look-up corresponding value in dictionary
    return regex.sub(lambda mo: dict[mo.string[mo.start():mo.end()]], text) 


if __name__ == "__main__": 

    text = "This is my first regex python example yahooa yahoouuee bbbiirdd"

    dict = {
        "a" : "a", 
        "b" : "book",
        "c" : "cook",
        "d" : "dook",
        "e" : "e", 
        "f" : "fook",
        "g" : "gook",
        "h" : "hook",
        "i" : "i",
        "j" : "jook", 
        "k" : "kook",
        "l" : "look",
        "m" : "mook",
        "n" : "nook",
        "o" : "o",
        "p" : "pook",
        "q" : "qook",
        "r" : "rook",
        "s" : "sook",
        "t" : "took",
        "u" : "u",
        "v" : "vook",
        "w" : "wook",
        "x" : "xook",
        "y" : "yook",
        "z" : "zook",
    } 


    print multiple_replace(dict, re.sub(r'([bcdfghjklmnpqrstvwxyz])\1', r'science\1', text, flags = re.I)) 
4

2 に答える 2

2

コードは の 2 文字text"science"と の文字に置き換えてから、 に文字列を渡し、 の文字をmultiple_replace含む各 1 文字を"science"対応する辞書の値に置き換えます。

置換を行うためのより良い方法は、コールバックを渡して、sub2 文字または 1 文字に一致する正規表現を使用することです。コールバックは、何が一致したかを判断し、対応する置換を返します。

既に持っているコードを使い続けたい場合、文字"science"が置き換えられないようにする簡単な方法は、正規表現を次のように変更するmultiple_replaceことです。

regex = re.compile("science|(?<!science)(%s)" % "|".join(map(re.escape, dict.keys())))

に追加"science" : "science",dictます。

これは"science"が に置き換えられることを意味し"science"、否定の後読み(?<!science)はそれに続く文字が置き換えられないようにします。

ただし、上記は問題の良い解決策ではありません。運が良ければ、私よりも Python に詳しい人が、より良いものを提供してくれるでしょう。

コメントに加えて、eyquemのソリューションを適応させる

import re

def multiple_replace(dict, text):

    def repl(match):
        single, double = match.groups()
        if double:
            return 'science' + single
        else:
            return dict[single] if single in dict else single

    return re.sub(r'([bcdfghj-np-tv-z])(\1)?', repl, text, flags=re.I)    

if __name__ == "__main__":     
    text = "This is my d's first try at cing, yahooa yahoouuee bbbiirdd"   
    dict = { "b" : "blah", "c" : "cook", "d" : "dog" }   

    print multiple_replace(dict, text)
    # This is my dog's first try at cooking, yahooa yahoouuee sciencebblahiirscienced
于 2013-03-02T21:18:44.777 に答える
2

の出力は、あなたが書いたもので あって"This is my first ...はなりませんが、
Thookisook isook mookyook fookirooksooktook`...
Tookhookisook isook mookyook fookirooksooktook ...

次のコードは、説明に従ってジョブを実行します。
辞書は必要ありません。

import re 

if __name__ == "__main__":

    def repl(ma):
        g1,g2 = ma.groups()
        if g2:
            return 'science' + g2
        else:
            return g1 + 'ook'


    print '------------ 1 ----------------------'
    text = "This is my first regex python example yahooa yahoouuee bbbiirdd"
    print text,'\n'
    wanted = ('Tookhookisook isook mookyook fookirooksooktook '
              'rookegookexook pookyooktookhookonook exookamookpooklooke '
              'yookahookooa '
              'yookahookoouuee '
              'sciencebbookiirookscienced')
    print 'wanted == %s' % wanted

    res = re.sub(r'([bcdfghj-np-tv-z])(\1?)',
                 repl,
                 text,
                 flags = re.I)
    print '\nres == %s' % res
    print 'res==wanted  : ',res==wanted

    print '------------ 2 ----------------------'
    print 'bbbiirdd'
    wanted = 'sciencebbookiirookscienced'
    print 'wanted == %s' % wanted
    res = re.sub(r'([bcdfghj-np-tv-z])(\1?)',
                                  repl,
                                  'bbbiirdd',
                                  flags = re.I)
    print '\nres == %s' % res
    print 'res==wanted  : ',res==wanted
于 2013-03-02T21:49:59.070 に答える