我想知道将“haaaaapppppyyy”转换为“haappyy”之类的最佳方式是什么。
基本上,在解析俚语时,人们有时会重复字符以增加强调。
我想知道最好的办法是什么?使用set()
不起作用,因为字母的顺序显然很重要。
有什么想法吗?我正在使用Python + nltk。
答案 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']