Python 将dict中的所有替换正则表达式应用于给定文本的最快方法
我有一个dict的形式(regexp,substitution_string),我想将这个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
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)