我想知道将"haaaaapppppyyy"这样的内容转换成"haappyy"最好的方法是什么。
基本上,当解析俚语时,人们有时会重复字符以增加强调效果。
我想知道怎么做才是最好的呢?使用set()
无法正常工作,因为字母的顺序显然很重要。
有任何想法吗?我正在使用Python + NLTK。
我想知道将"haaaaapppppyyy"这样的内容转换成"haappyy"最好的方法是什么。
基本上,当解析俚语时,人们有时会重复字符以增加强调效果。
我想知道怎么做才是最好的呢?使用set()
无法正常工作,因为字母的顺序显然很重要。
有任何想法吗?我正在使用Python + NLTK。
>>> import re
>>> re.sub(r'(.)\1+', r'\1\1', "haaaaapppppyyy")
'haappyy'
(.)\1+
会将任何字符 (.
) 后面跟着一个或多个相同的字符(因为反向引用 \1
必须是相同的)替换为两个字符。
r'(.)\1{2,}'
代替,这样重复的字符就不会被替换掉了(现在你只是用它们替换它们自己)。这应该能让你更快一些。 - Tim Pietzckeritertools.groupby
来压缩多个字母的出现:>>> ''.join(c for c, _ in groupby("haaaaapppppyyy"))
'hapy'
同样地,你可以通过groupby
得到haappyy
。
>>> ''.join(''.join(s)[:2] for _, s in groupby("haaaaapppppyyy"))
'haappyy'
>>> s = 'hhaaaaapppppyyy'
>>> ''.join(['' if i>1 and e==s[i-2] else e for i,e in enumerate(s)])
'haappyy'
>1
和-2
。一般情况如下:>>> reps = 1
>>> ''.join(['' if i>reps-1 and e==s[i-reps] else e for i,e in enumerate(s)])
'hapy'
这是一种做法(受明显约束,即Python不会说英语)。
>>> s="haaaappppyy"
>>> reduce(lambda x,y: x+y if x[-2:]!=y*2 else x, s, "")
'haappyy'