8

スペルチェッカーに入力するために単語を引き出す必要のある実際のテキストのセットがたくさんあります。あまりノイズを出さずに、できるだけ多くの意味のある単語を抽出したいと思います。この辺りには正規表現の忍者がたくさんいることを知っているので、誰かが私を助けてくれることを願っています。

現在、すべてのアルファベット順を。で抽出してい'[a-z]+'ます。これは大丈夫な概算ですが、それでたくさんのゴミを引きずり出します。

理想的[/-_,.: ]には、自然な単語の区切り文字(など)で区切られたすべてのアルファベット順を抽出し、境界が不正なアルファベット順を無視する正規表現(きれいで効率的である必要はありません)が必要です。

ただし、数字に隣接していないすべてのアルファベット順のシーケンスを取得できることも嬉しいです。したがって、たとえば、を'pie21'抽出しません'pie'が、'http://foo.com'を抽出し['http', 'foo', 'com']ます。

lookaheadアサーションを試しlookbehindましたが、文字ごとに適用されました(たとえば、何も返さない場合re.findall('(?<!\d)[a-z]+(?!\d)', 'pie21')は返さ'pi'れます)。アルファ部分を用語()としてラップしようとしました(?:[a-z]+)が、役に立ちませんでした。

詳細:データは電子メールデータベースであるため、ほとんどが通常の数字の平易な英語ですが、ときどき、のようなゴミの文字列があり、完全に無視したいと思いますGIHQ4NWL0S5SCGBDD40ZXE5IDP13TYNEAAC7A21C0数字が含まれているアルファベット順はゴミだと思います。

4

4 に答える 4

18

ASCII 文字に制限する場合は、(re.Iオプション セットを使用して)を使用します。

\b[a-z]+\b

\b単語境界アンカーで、英数字の「単語」の最初と最後でのみ一致します。Soには一致しますが、 orには\b[a-z]+\b一致pieしません。pie2121pie

他の非 ASCII 文字も許可するには、次のようなものを使用できます。

\b[^\W\d_]+\b

アクセント付き文字なども使用できre.UNICODEます。特に Python 2 を使用している場合は、\wショートハンドが非 ASCII 文字と一致するようにするために、オプションを設定する必要がある場合があります。

[^\W\d_]否定文字クラスとして、数字とアンダースコアを除くすべての英数字を使用できます。

于 2011-04-19T14:25:35.683 に答える
3

単語の境界に精通していますか? ( \b)。\bシーケンスの前後を使用して単語を抽出し、次の範囲内でアルファベットを一致させることができます。

\b([a-zA-Z]+)\b

たとえば、これは単語全体を取得しますが、ハイフン、ピリオド、セミコロンなどのトークンで停止します。

Pythonマニュアル\bで、シーケンスなどを実行できます

編集また、一致の前後の数字を探している場合は、否定的な先読み/後ろ読みを使用できます。

(?!\d)   # negative look-ahead for numbers
(?<!\d)  # negative look-behind for numbers
于 2011-04-19T14:26:31.970 に答える
2

どうですか:

import re
yourString="pie 42 http://foo.com GIHQ4NWL0S5SCGBDD40ZXE5IDP13TYNEA  pie42"
filter (lambda x:re.match("^[a-zA-Z]+$",x),[x for x in set(re.split("[\s:/,.:]",yourString))])

ご了承ください:

  • split は文字列を潜在的な候補に分解します => 「潜在的な単語」のリストを返します
  • set は単一性フィルタリングを行います => set 内のリストを変換し、複数回出現するエントリを削除します。この手順は必須ではありません。
  • filter は候補の数を減らします: リストを受け取り、各要素にテスト関数を適用し、テストに成功した要素のリストを返します。私たちの場合、テスト関数は「匿名」です
  • lambda : 無名関数、項目を取得して単語かどうかをチェック (大文字または小文字のみ)

編集:いくつかの説明を追加

于 2011-04-19T14:32:34.587 に答える