9

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

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

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

有任何想法吗?我正在使用 Python + nltk。

4

4 回答 4

32

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

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

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

于 2012-04-09T11:56:50.863 回答
8

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

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

同样,您可以haappyygroupbywith

>>> ''.join(''.join(s)[:2] for _, s in groupby("haaaaapppppyyy"))
'haappyy'
于 2012-04-09T11:57:45.923 回答
1

您应该在没有减少或正则表达式的情况下执行此操作:

>>> 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'
于 2016-09-13T13:57:02.853 回答
0

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

>>> s="haaaappppyy"
>>> reduce(lambda x,y: x+y if x[-2:]!=y*2 else x, s, "")
'haappyy'
于 2012-04-09T11:54:53.377 回答