2017-06-27 28 views
7

stackoverflowには文字列からアルファベット文字のみを保持する方法に関する多くの回答があります。最も一般的なものは有名な正規表現'[^a-zA-Z]'です。しかし、この答えは誰もが英語だけを書いていると仮定しているので、全く間違っています...私はこれらすべての回答に投票することができたと思ったが、私は答えを見つけることができないので、文字列内にアルファベット文字(多言語)のみを残す

Pythonには、すべての言語で動作する文字列のアルファベット文字のみを保持する方法がありますか?私は

+3

私は全体Unicodeを含めると非アルファベット文字に私は全く同じ方法を考えていた –

+0

@MoonCheesezを除外する方が簡単かもしれないと思います。シェルスクリプトでこれを行う簡単な方法がありますが、今はPythonの方法を考えることはできません。 –

答えて

7

など...私は英語だけでなくフランス語、ロシア語、中国語、greec意味すべての言語では... JavaScriptでxregexpのように行うことができライブラリについて多分考える[^ \ W \ D_]

Python2ではPython3またはre.UNICODEフラグを使用して、[^\W\d_]を使用できます。 W \

:UNICODEが設定されている場合、これは[0-9_]以外のプラスUnicode文字 特性データベースで英数字ではないと分類 文字に一致します。

したがって[^\W\d_]は、英数字ではなく、数字でもアンダースコアでもないものです。つまり、アルファベットの文字です。 :)

>>> import re 
>>> re.findall("[^\W\d_]", "jüste Ä tösté 1234 ßÜ א д", re.UNICODE) 
['j', 'ü', 's', 't', 'e', 'Ä', 't', 'ö', 's', 't', 'é', 'ß', 'Ü', 'א', 'д'] 

この複雑なロジックを回避するために

「W \」を探し、その後、最初の数字を削除し、あなたはまた、数字を削除し、最初のアンダースコア、その後、英数字のためになります:

>>> without_digit = re.sub("[\d_]", "", "jüste Ä tösté 1234 ßÜ א д", re.UNICODE) 
>>> re.findall("\w", without_digit, re.UNICODE) 
['j', 'ü', 's', 't', 'e', 'Ä', 't', 'ö', 's', 't', 'é', 'ß', 'Ü', 'א', 'д'] 

正規表現モジュール

\p{L}またはを理解しているので、regexモジュールは、助けることができると思われます10。

このregexの実装は、標準の 're'モジュールと下位互換性がありますが、追加の機能を提供します。 (アナコンダはPython 3.6でテスト済み)

>>> import regex as re 
>>> re.findall("\p{L}", "jüste Ä tösté 1234 ßÜ א д", re.UNICODE) 
['j', 'ü', 's', 't', 'e', 'Ä', 't', 'ö', 's', 't', 'é', 'ß', 'Ü', 'א', 'д'] 

+0

私は 'regex'モジュールと' \ p {L} 'を試しました。それはアクセントのないラテン文字だけを保持しているようです...たぶんどこかで何かが間違っていたかもしれませんが、ドキュメンテーションの例: p {L} - QW]# 'Q'と 'W'以外のすべての文字を含むセット – Laurent

+1

あなたの最初と2番目の例が完全に動作するように見えます。 – Laurent

+0

私はバージョン2.7.9を使用しています。バージョン3で試してみましたが、Pythonでインストールされた 'regex'をインポートしようとするときに問題があります。私はPythonの専門家ではなく、' regex'をインポートしようと多くの時間を費やしたくないので、 。 – Laurent