正则表达式将'lol'与'lolllll'和'omg'匹配为'omggg'等

ape*_*dge 4 python regex string-matching

嘿那里,我喜欢正则表达式,但我根本不擅长它们.

我有一个大约400个缩短词的列表,如lol,omg,lmao等.每当有人输入这些缩短的单词中的一个时,它就会被其英语副本替换([笑声]或其他类似的东西).无论如何,人们很烦人,并且用最后一个字母重复x次来输入这些简短的单词.

例子:omg - > omgggg,lol - > lollll,哈哈 - > haha​​haha,哈哈 - > lololol

我想知道是否有人可以递给我正则表达式(最好用Python)来解决这个问题?

谢谢大家.

(这是一个与Twitter相关的主题识别项目,如果有人好奇.如果有人发推文"让我们去拍摄一些箍",你怎么知道这条推文是关于篮球等等)

Sri*_*aju 7

第一种方法 -

好吧,使用正则表达式,你可以这样做 -

import re
re.sub('g+', 'g', 'omgggg')
re.sub('l+', 'l', 'lollll')
Run Code Online (Sandbox Code Playgroud)

等等

我要指出,使用正则表达式是处理这个问题的一种非常脆弱和基本的方法.您可以轻松地从用户获取字符串,这将打破上述正则表达式.我想说的是,这种方法需要进行大量维护,以便观察用户犯错的模式,然后为他们创建特定于案例的正则表达式.

第二种方法 -

相反,你考虑过使用difflib模块吗?它是一个带有帮助器的模块,用于计算对象之间的增量.对你来说特别重要的是SequenceMatcher.从官方文件中解释-

SequenceMatcher是一个灵活的类,用于比较任何类型的序列对,只要序列元素是可清除的.SequenceMatcher尝试计算两个序列之间的"人类友好差异".基本概念是最长的 连续和无垃圾匹配子序列.

import difflib as dl
x   = dl.SequenceMatcher(lambda x : x == ' ', "omg", "omgggg")
y   = dl.SequenceMatcher(lambda x : x == ' ', "omgggg","omg")
avg = (x.ratio()+y.ratio())/2.0
if avg>= 0.6: 
    print 'Match!'
else:
    print 'Sorry!'
Run Code Online (Sandbox Code Playgroud)

根据文档,任何比率()超过0.6是一个紧密匹配.您可能需要探索调整数据需求的比率.如果你需要更严格的匹配,我发现任何超过0.8的值都很好.