从单词中删除重复的字符

时间:2012-04-09 11:50:01

标签: python nlp nltk

我想知道将“haaaaapppppyyy”转换为“haappyy”之类的最佳方式是什么。

基本上,在解析俚语时,人们有时会重复字符以增加强调。

我想知道最好的办法是什么?使用set()不起作用,因为字母的顺序显然很重要。

有什么想法吗?我正在使用Python + nltk。

5 个答案:

答案 0 :(得分:25)

可以使用正则表达式完成:

>>> import re
>>> re.sub(r'(.)\1+', r'\1\1', "haaaaapppppyyy")     
'haappyy'

(.)\1+补充任何字符(.)后跟一个或多个相同的字符(因为backref \1必须相同)两倍的字符。

答案 1 :(得分:7)

您可以使用itertools.groupby压缩多次出现的字母:

>>> ''.join(c for c, _ in groupby("haaaaapppppyyy"))
'hapy'

同样,您可以使用

haappyy获取groupby
>>> ''.join(''.join(s)[:2] for _, s in groupby("haaaaapppppyyy"))
'haappyy'

答案 2 :(得分:1)

您应该在不使用reduce或regexp的情况下执行此操作:

>>> 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'

答案 3 :(得分:0)

这是一种方法(仅限于python不会说英语的明显约束)。

>>> s="haaaappppyy"
>>> reduce(lambda x,y: x+y if x[-2:]!=y*2 else x, s, "")
'haappyy'

答案 4 :(得分:-1)

对于您提到的set(),可以使用collections.OrderedDict来保持字母的顺序。因此使用:

text = "happy"
print(list(OrderedDict.fromkeys(text)))

这将为您提供:

['h', 'a', 'p', 'y']