我想编写一个正则表达式来删除字符串中的最后一个字符,如果该字符是 (s)。
但是,如果前面有另一个 (s),我想保留 (s)。
例子。
Apples 的输出应该是Apple。
Process 的输出应该是 Process。
我需要一个正则表达式,如果表达式匹配,它会捕获整个术语,但会执行部分匹配的替换。
我已经使用 s$ 去掉了最后一个字符。
请您参考如下方法:
这个问题已经被讨论过太多次了,共识总是:它太复杂了,无法通过简单的正则表达式来处理。这些示例的所有解决方案都失败了:
apples
carrots
process
processes
tennis
解决方案是使用 morpha :
git clone https://github.com/knowitall/morpha
cd morpha/
flex -i -Cfea -8 -omorpha.yy.c morpha.lex
gcc -o morpha morpha.yy.c
curl -s https://raw.githubusercontent.com/jhlau/predom_sense/master/lemmatiser_tools/morpha/verbstem.list > verbstem.list
现在测试:
cat test.txt | ./morpha -c
apple
carrot
process
process
tennis
如果你想要一个 python 解决方案,我建议你使用 nltk。
virtualenv env-nltk
source env-nltk/bin/activate
pip install nltk
python -c "import nltk; nltk.download()" # <- just get the whole thing, click "all" and then "download" on the "collections" tab
现在一切都已下载,让我们启动 python 并使用它。
>>> from nltk.stem.wordnet import WordNetLemmatizer
>>> lmtzr = WordNetLemmatizer()
>>> lmtzr.lemmatize('apples')
u'apple'
>>> lmtzr.lemmatize('tennis')
'tennis'
>>> lmtzr.lemmatize('process')
'process'
>>> lmtzr.lemmatize('processes')
u'process'
