在谈论正则表达式时,我面临着替换组合词开头的连字符的问题。
例如:wo-wo-wo-wonder -> wonderhi-hi-hi-hi -> hiwo-wo-wo -> wof-f-f-fight
因此,对于文本中的每个单词,我想替换在主单词(wonder
)之前具有部分或全部重复的主单词(wo-wo-wo
以及wonder-wonder-wonder
)的单词。
同时,不得替换诸如bi-linear
或pre-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)