我想知道将“haaaaapppppyyy”之类的内容转换为“haappyy”的最佳方法是什么。
基本上,在解析俚语时,人们有时会重复字符以增加重点。
我想知道最好的方法是什么?使用set()
不起作用,因为字母的顺序显然很重要。
有任何想法吗?我正在使用 Python + nltk。
可以使用正则表达式来完成:
>>> import re
>>> re.sub(r'(.)\1+', r'\1\1', "haaaaapppppyyy")
'haappyy'
(.)\1+
将任何字符 ( .
) 后跟一个或多个相同字符(因为 backref\1
它必须相同)替换为两倍的字符。
您可以使用以下方法压缩多次出现的字母itertools.groupby
:
>>> ''.join(c for c, _ in groupby("haaaaapppppyyy"))
'hapy'
同样,您可以haappyy
从groupby
with
>>> ''.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'