在谈论正则表达式时,我面临着替换组合词开头的连字符的问题。

例如:

wo-wo-wo-wonder -> wonderhi-hi-hi-hi -> hiwo-wo-wo -> wof-f-f-fight

因此,对于文本中的每个单词,我想替换在主单词(wonder)之前具有部分或全部重复的主单词(wo-wo-wo以及wonder-wonder-wonder)的单词。
同时,不得替换诸如bi-linearpre-trained之类的组合词,因为在这种情况下,连字符(pre)不在主词(train)中。

我已经看到了此解决方案[Python find all occurrences of hyphenated word and replace at position],显然它可以是一个很好的解决方案。
但是我的问题是完全不同的,因为我不想对连字符的长度施加限制,同时我想检查连字符是否是主词的一部分。

这是我实际使用的正则表达式,但是如前所述,它不能解决我的全部问题。

re.sub(r'(?<!\S)(\w{1,3})(?:-\1)*-(\w+)(?!\S)', '\\2', s)

最佳答案



r'(?<!\S)(\w+)(?:-\1)*-(\1)'


要么

r'\b(\w+)(?:-\1)*-(\1)'


请参见regex demo

细节


(?<!\S)-空格边界(如果使用\b,则为单词边界)
(\w+)-组1:任意一个或多个单词字符
(?:-\1)*-0次或多次重复-和组1值
--连字符
(\1)-第2组:与第1组相同的值。


Python示例re.sub

s = re.sub(r'(?<!\S)(\w+)(?:-\1)*-(\1)', r'\2', s)

09-25 23:49