我正在尝试用C#处理似乎使用语音到文本的转录。我遇到的一个主要问题是重复单词和/或短语。我喜欢使用RegEx表达式来替换它们。以下是一些例子:
我,我,我很想去,但是我我不行,不行。
我真的很想使用regex替换,所以它会变成这样的东西
我真的很想去,但是我不能去。
看起来我有很多次单词重复,无论是有逗号还是没有逗号。如果我尝试寻找特定的替换,它将替换3中的2个,但留下最后两个。所以找到一种方法来寻找多个重复并将其替换为该单词的单个版本,这就成了一件皇家痛苦的事情,所以如果我有I,I,I。....它被替换为I或I I,并且它仅替换为一个I。
此外,如果有这样的短语:
你知道你知道你知道
希望能用一个人代替三个人
我试过这样的:\b(\w+)\s+\1\b
,但它不适用于逗号
我已经看过了,真的找不到任何东西,寻找逗号分隔的。如果要打好几通电话我也没意见,但我只是想弄清楚。
任何帮助将不胜感激!
3条答案
按热度按时间9q78igpj1#
您可以使用
(\b\w+(?:\s+\w+)*?)(,?\s*\1)+\b
和替换字符串$1
。给你
(\b\w+(?:\s+\w+)*?)
匹配由空格符号分隔的一个或多个单词:\b\w+
匹配从单词开始的单词符号,(?:\s+\w+)*?
多个空格符号,后跟单词符号,重复任意次数(尽可能少)。(,?\s*\1)+
匹配第一组匹配的相同单词(因此是\1
),由可选逗号和任意数量的空格分隔,重复多次。\b
确保最后一次重复不会停在单词的中间。演示here。
**注意:**这个正则表达式将删除任何重复的问题。但有时重复的话可能是有效的。类似于
We'll move, move far away
。编辑:为了在重复之间容纳点,您可以使用
它将匹配重复单词之间的以下分隔符:
,
、.
、,
、.
、,
等。如果你想匹配任何标点符号和空格的组合,你可以使用
甚至
第一个匹配点、逗号和空格的任意组合,例如
,. , .
。第二种-空格和任何标点符号的任意组合,例如*;!? .
。演示here。
hjqgdpho2#
可以将以下正则表达式的匹配项转换为空字符串。
这个想法是删除一个短语,如果同一个短语紧跟着。
Demo
此正则表达式具有以下元素。
cuxqih213#
想要在评论中感谢MarkAlex提供的解决方案