0

我有单个字母 b、c、d.... 我使用字典和正则表达式库中的 re.sub 和 multiple_replace 函数替换了随机单词。所以,b = 书,c= 厨师,d= dook,等等。

但是,如果重复出现 bb、cc 或 dd ......我希望能够让这些字母打印出其他内容,而不是所有双字母都相当于单个单词,例如 bb= blah、cc = blah , 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 函数包括除元音之外的所有双字母,将替换为单词 science 加上它们的字母。文本表示我想要转换为字典中的字符串替换的输入字符串。

所以,我希望输出为 bb =scienceb, cc=sciencec 但我目前遇到的问题是,而不是打印我想要的字符串“science”。它打印出字典中找到的单词 science 的字符串替换。因此,例如“s”:“sook”,“c”:“cook”,“i”:“i”,“n”:“nook”,

所以它会打印出任何双字母单词,它将在我的文本字符串中用sookcookiecooknooke 替换它。这是为什么?我该如何解决?

如果我感到困惑,请告诉我。非常感谢!

编辑:

这是我正在使用的代码:

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

您的代码将其中的双字母替换为text"science"字母,然后将字符串传递给该字符串multiple_replace,然后将每个单个字母(包括其中的字母)"science"替换为其对应的字典值。

进行替换的更好方法是将回调传递给sub并使用匹配双字母或单字母的正则表达式。回调将确定匹配的内容并返回相应的替换。

如果您想坚持使用已有的代码,防止字母"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 回答