1

典型的な単語の接尾辞のセット(ize、fy、ly、able ...など)の場合、特定の単語がそれらのいずれかで終わっているかどうかを知り、その後それらを削除したいと思います。これは、たとえばword.endswith('ize')を使用して繰り返し実行できることは知っていますが、それを実行するためのより適切な正規表現の方法があると思います。終了マーカー$を使用して積極的な先読みを試みましたが、何らかの理由で機能しませんでした。

pat='(?=ate|ize|ify|able)$'
word='terrorize'
re.findall(pat,word)
4

5 に答える 5

6

あまり知られていない事実:endswith可能性のタプルを受け入れます:

if word.endswith(('ate','ize','ify','able')):
    #...

残念ながら、どの文字列が見つかったかは示されないため、サフィックスを削除するのに役立ちません。

于 2013-02-23T13:42:48.190 に答える
2

あなたが探しているのは実際には(?:)
これをチェックしてください:

re.sub(r"(?:ate|ize|ify|able)$", "", "terrorize")

このサイトの正規表現をご覧ください。
有用な正規表現スキルのトーンがあります。楽しんでくれると良いです。

ところで、Pythonライブラリ自体はすっきりとした素晴らしいチュートリアルです。
私はhelp()をたくさんします:)

于 2013-02-23T13:22:22.410 に答える
1

先読みはアンカーパターンであり、特定の場所にアンカーが一致するの^と同じ$ですが、それ自体は一致しません。

これらの接尾辞を一致させたいが、単語の終わりにあるため、\b代わりに単語エッジアンカーを使用します。

r'(ate|ize|ify|able)\b'

次に、re.sub()それらを置き換えるために使用します。

re.sub(r'(ate|ize|ify|able)\b', '', word)

これは問題なく機能します:

>>> word='terrorize'
>>> re.sub(r'(ate|ize|ify|able)\b', '', word)
'terror'
于 2013-02-23T13:13:49.950 に答える
1

かっこを調整する必要があります。pat次から変更するだけです。

(?=ate|ize|ify|able)$

に:

(?=(ate|ize|ify|able)$)

後でサフィックスを削除する必要がある場合は、次のパターンを使用できます。

^(.*)(?=(ate|ize|ify|able)$)

REPLでのテスト:

>>> pat = '^(.*)(?=(ate|ize|ify|able)$)'
>>> word = 'terrorize'
>>> re.findall(pat, word)
[('terror', 'ize')]
于 2013-02-23T13:14:32.993 に答える
0

単語ごとの一致の場合は、先読みチェックを削除するだけで、$ caretで十分です。

于 2013-02-23T13:15:16.697 に答える