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

Python 将dict中的所有替换正则表达式应用于给定文本的最快方法,python,regex,replace,Python,Regex,Replace,我有一个dict的形式(regexp,substitution_string),我想将这个dict中的所有正则表达式应用到文本中(操作顺序无关紧要)。现在我有了一些类似的东西: EMOTICON_REGEXPS = { r'(:D|;D|:-D|;-D|<3|:\*)': ' EMOJIPOS ', r'[:|;]?(\))\1+': ' EMOJIPOS ', r'[:|;]?(\()\1+': ' EMOJINEG ', } def replace_emoticon

我有一个dict的形式(regexp,substitution_string),我想将这个dict中的所有正则表达式应用到文本中(操作顺序无关紧要)。现在我有了一些类似的东西:

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

但这似乎没有更快。

您可以将所有regexp合并到一个中,并在一次调用
re.sub
(使用as replacement)中执行所有替换,而不是在循环中多次执行:

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)
重新导入
表情符号\u REGEXPS={

r':D |;D |::-D |-D |能否请您详细说明一下您的代码--为什么要将函数作为第二个参数传递给re.sub,而m.group(I+1)的作用是什么操作意思?有没有更简单的方法可以像在这段代码中一样执行相同的操作?您需要一个函数作为
re.sub
的第二个参数,因为替换字符串取决于匹配的内容。您链接到的代码执行相同的操作,但它使用dict进行替换查找。您不能使用dict进行替换查找,因为您有可变长度的模式(与任意长的
字符串匹配)
s例如)。我测量了时间,您的方法稍微慢了一点。调用替换函数会有开销,因此如果您有大量的模式,那么我的解决方案是合适的,这样循环中的迭代次数将比我的解决方案中的开销要多。事实上,您只有3种不同的模式,因此我的解决方案的开销可能不值这个代价。
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)