将字典中的所有替换正则表达式应用于给定文本的最快方法

时间:2018-08-14 13:58:43

标签: python regex replace

我有一个形式为reg(regexp,alternation_string)的字典,我想将所有该字典的正则表达式应用于文本(操作顺序无关紧要)。现在,我遵循以下原则:

clf.load('trainingData.yml')

有没有更快/更短的方法来做同样的事情?我也知道

EMOTICON_REGEXPS = {
   r'(:D|;D|:-D|;-D|<3|:\*)': ' EMOJIPOS ',
   r'[:|;]?(\))\1+': ' EMOJIPOS ',
   r'[:|;]?(\()\1+': ' EMOJINEG ',
}

def replace_emoticons(text):
    text_no_emoticons = text
    for (regexp, emoticon) in EMOTICON_REGEXPS_:
        text_no_emoticons = re.sub(regexp, emoticon, text_no_emoticons)
    return text_no_emoticons

但这似乎没有更快。

1 个答案:

答案 0 :(得分:1)

您可以将所有正则表达式合并为一个,并在一次调用re.sub中进行所有替换(以function作为替换),而不必循环多次:

import re
EMOTICON_REGEXPS = {
   r':D|;D|:-D|;-D|<3|:\*': ' EMOJIPOS ',
   r'[:|;]?\)+': ' EMOJIPOS ',
   r'[:|;]?\(+': ' EMOJINEG ',
}
emojis = EMOTICON_REGEXPS.values()
def replace_emoticons(text):
    def replace(m):
        for i in range(len(emojis)):
            if m.group(i + 1):
                return emojis(i)
    return re.sub('|'.join('({})'.format(r) for r in EMOTICON_REGEXPS), replace, text)