2016-05-17 4 views
1

文字がaであれば、文字列から最後の文字を削除する正規表現を書いてみたいと思います。条件付きの最後の単語を取り除くRegex

しかし、これを行う際には、別のものが先行する場合はそのままにしておきたいと思います。

例。

Applesの出力はAppleである必要があります。
Processの出力はProcessである必要があります。

正規表現が必要ですが、式が一致していて部分一致の置換を実行する場合は、用語全体を取り込む正規表現が必要です。

私はs$を使用して最後の文字を取り除いています。

+0

いくつかのコードを追加して下さい –

+0

参照[*パイソンパターンsingularize *に用語を追加するには良い方法](http://stackoverflow.com/questions/23586591/good-way-to-add-terms-to -python-pattern-singularize) –

+0

Regexはこの問題の良い解決策ではありません。Pythonベースのソリューションの最善の策は 'ntlk'です。 –

答えて

4

これはおよそあまりにも何度も話をしており、コンセンサスが常にある:簡単な正規表現を使用して処理することへの道が複雑すぎます。ソリューションのすべては、これらの例で失敗:あなたはPythonのソリューションをしたい場合は、私がお勧め

cat test.txt | ./morpha -c 
apple 
carrot 
process 
process 
tennis 

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 

テストに:

apples 
carrots 
process 
processes 
tennis 

ソリューションはmorphaを使用することですあなたは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' 
+1

こんにちはハビエル、答えに感謝します。私は雪球茎を使っていますが、雪球茎は「s」が前に付いていれば「e」さえも茎についています。私は実際にWordNetLemmatizerを考えなかった。それを指摘していただきありがとうございます – Sam

+0

もう一つのことは、WordNetLemmatizerは "リンゴの"世話をしないということです。あなたはこのシナリオとそれ以前のもの(リンゴ、プロセス)を扱うことができる他のステマーのことを知っています – Sam

+0

@Sam多分https://pypi.python.org/pypi/inflect ??私は知らない、私の素朴な最初の試みは言っているだろう: 're("?)($ |) "、 '\ g <1> \ g <2>'、"りんごのリンゴ ")'それを実行するここでまず最初に '.lemmatize()'を実行してください - それが助けにならない場合は私に知らせてもう少し研究をすることができます –

2

あなたはこの負の後読みアサーションを使用することができます。

(?<!s)s$ 

RegEx Demo

分裂:

(?<!s) # assert previous position doesn't have 's' 
s  # match 's' 
$  # assert end of line 
+1

' Processes'は 'Processe'になります –

+0

それも。 OPの要件に準拠しています*別のものが先行する場合はそのままにしておきたい* – anubhava

+1

私はそれを要件と呼ぶことはほとんどありません。この「解決策」は、これらの2つの例でしか動作しないようですが、「テニス」で失敗し、@WiktorStribiżewのように言いました。 "プロセス" –

0

あなたはsがない場合にのみ置換が起こることを確認するために、負の後読みアサーションを使用することができますもう1つはsです。

>>> import re 
>>> re.sub(r'(?<!s)s$', '', 'Apples') 
'Apple' 
>>> re.sub(r'(?<!s)s$', '', 'Process') 
'Process' 
関連する問題