我有一个巨大的文本文件,其中包含类似的内容:
mango
mangoes
orange
oranges
cat
cats
我想删除这些复数字。所以它仍然存在:
mango
orange
cat
答案 0 :(得分:6)
这个问题不适合正则表达式(在撰写本文时,问题标记为正则表达式)。正则表达式适用于匹配模式和常规语言。 英语不是常规语言(也就是说,英语不是可以使用正则表达式表达的正式语言),就像HTML和XML不是常规语言一样。英语中的复数形式实际上是证明问题的好方法:car
的复数是cars
,但bus
的复数不是buss
而是busses
。正如问题所示,mango
的复数形式不是常规形式mangos
,而是mangoes
。更糟糕的是,并非所有以o
结尾的名词都会通过添加oes
形成复数形式 - piano
的复数形式为pianos
而非pianoes
.. wolf
和wife
前往wolves
和wives
以及child
前往children
怎么办?
所以我希望你被定罪 - 你一定会遇到麻烦。
您必须在常规复数形式中写出一些例外列表,在单数形式之后添加s
。
您需要的是实现一个基本的词干分析器(仅涉及复数形式)。如需进一步阅读,请参阅:http://tartarus.org/martin/PorterStemmer/
一旦你干了字,就可以使用哈希集来有效地检查重复项。单个传递单词,词干并添加到设置(如果尚未在集合中)。如果已经在集合中 - 删除单词,因为它是重复的。唯一的问题是这不能保证您删除复数形式。没有英文字典,问题就不容易了。
如果你想要非常好的准确性,你需要使用将单数形式复数形式的英语单词词典。
答案 1 :(得分:-1)
如果您只想过滤掉以s
结尾的行:
grep -P '[^s]$' file.txt > newfile.txt