0


1

通常、Pythonで国際言語を使用する場合のベストプラクティスは、Unicodeを使用し、入力を早期にUnicodeに変換し、文字列エンコーディングに変換することです(ほとんどの場合UTF-8)。

しかし、私がUnicodeでRegExを実行する必要があるとき、そのプロセスが本当にフレンドリーであるとは思いません。 例えば、もし私が書く必要がある1つ以上のスペースが続く 'é’文字を見つける必要があるなら(注:私のシェルまたはpythonファイルはUTF-8に設定されています):

re.match( '(?u)\ xe9 \ s'、Unicode)

だから私は 'é’のUnicodeコードを書かなければなりません。 それはそれほど便利ではありません、そして、もし私が変数からRegExを構築する必要があるなら、物事は醜くなり始めます。 例:

word_to_match = 'Élisa™' .decode( 'utf-8')#​​ユニコードオブジェクトを返す#regex = '(?u)%s \ s'

これは簡単な例です。 そのため、特殊文字を使用して次々に実行する正規表現が多数ある場合は、UTF-8でエンコードされた文字列に対してRegExを実行するほうが簡単で自然です。 例:

re.match( 'Élisa\ s'、string)re.match( 'Geneviève\ s'、文字列)re.match( 'DrØshtit\ s'、文字列)

足りないものはありますか。 UTF-8アプローチの欠点は何ですか?

更新

わかりました、私は問題を見つけます。 私はipythonで私のテストをしていましたが、残念ながらそれはエンコーディングを台無しにしているようです。 例:

Pythonシェルで

>>> string_utf8 = '論文を引用符で囲みます>>> string_utf8' theses \ xc2 \ xbbを引用符で検定\ xc3 \ x89l \ xc3 \ xa9ments '>>>論文を引用してtest >>引用符Éléments>>> >>> unicode_string = u'Test«引用符»Éléments '>>> unicode_string u'Test \ xab引用符\ xbb引用符\ xc9l \ xe9ments' >>>印刷unicode_string検定«引用符付き»例>>> >>> unicode_decoded_from_utf8 = string_utf8.decode( 'utf-8')>>> unicode_decoded_from_utf8 u'Test \ xab theses \ xbb引用符\ xc9l \ xe9ments '>>>印刷unicode_decoded要約を作成する»

ipythonで

In [1]:string_utf8 = '論文«引用符で囲まれた«テスト«

In [2]:string_utf8 Out [2]: 'theses \ xc2 \ xbbの引用符でテスト\ xc2 \ xab \ xc3 \ x89l \ xc3 \ xa9ments'

In [3]:print string_utf8テスト«引用文»引用符

In [4]:unicode_string = u'Test«with theses»引用符で囲まれた要素

In [5]:unicode_string Out [5]:u'Test \ xc2 \ xabとtheses \ xc2 \ xbbの引用符\ xc3 \ x89l \ xc3 \ xa9ments '

In [6]:unicode_stringテストを印刷する«論文が引用されている»引用符

In [7]:unicode_decoded_from_utf8 = string_utf8.decode( 'utf-8')

In [8]:unicode_decoded_from_utf8 Out [8]:これらの\ xbb引用符を付けた\ xbabを引用

In [9]:unicode_decoded_from_utf8を印刷«テスト»引用符付き«テスト

ご覧のとおり、ipythonはu ''表記を使用しているときにエンコーディングが面倒です。 それが私の問題の原因でした。 バグはここで言及されています:https://bugs.launchpad.net/ipython/ bug / 339642

2 Answer


3


あなたがあなたのPythonソースでutf-8を使っているなら、あなたはただ書くことができます:

ウエリサ

これはUnicode文字列で、次のように書くのと同じです。

u '\ xc9lisa'

そのため、接頭辞「u」を使用すると、デコードが不要になります。 あなたが 'u’を省略して書いたとします。

「エリサ」

次に、(utf-8でエンコードされた)バイト文字列があります。

'\ xc3 \ x89lisa'


3


あなたはPython 2.xを使っていますか? もしそうなら、それは一般的にバイト文字列にあなたの非ASCII文字を残すためにかなり悪い形式と見なされます。 Unicode文字列を使用する方法は、次のとおりです。

re.match(u'Élisa™\、s、unicodestring)

あなたの文字列リテラルの冒頭に「u」と書くのは少し変に見えるかもしれませんが、それはPython 3.xではなくなり、それほど悪くありません。

UTF-8文字列を正規表現と一致させることは、表現の限られたサブセットに対して機能します。 しかし、大文字と小文字を区別しないマッチ、 `[group]`内の非ASCII文字、あるいは長さを区別する表現を使いたいのなら、それは間違ったことになるでしょう。 Unicodeにこだわる。

(もし \ s`だけを使っているのなら、(?u) `はおそらく特に必要ないでしょう。それは、あなたがとにかくマッチさせたくないかもしれないもっと普通でないスペースのいくつかをもたらすだけです。 ただし、Unicode文字列の大文字と小文字を区別しないマッチングに便利です。