4

編集:「r」フラグの意味を理解すると、この質問は本当に意味がありません。詳細はこちら。簡単な答えを探している人のために、以下に追加しました。

Python スクリプトで正規表現を手動で入力すると、パターン文字列に 4 つのフラグの組み合わせを使用できます。

  • p1 =「パターン」
  • p2 = u「パターン」
  • p3 = r「パターン」
  • p4 = ru「パターン」

Web フォーム入力からの Unicode 文字列がたくさんあり、それらを正規表現パターンとして使用したいと考えています。

上記の手動フォームの使用から同様の結果を期待できるように、文字列にどのプロセスを適用する必要があるかを知りたいです。何かのようなもの :

import re
assert re.match(p1, some_text) == re.match(someProcess1(web_input), some_text)
assert re.match(p2, some_text) == re.match(someProcess2(web_input), some_text)
assert re.match(p3, some_text) == re.match(someProcess3(web_input), some_text)
assert re.match(p4, some_text) == re.match(someProcess4(web_input), some_text)

someProcess1 から someProcessN とは何で、その理由は何ですか?

someProcess2 は何もする必要はないと思いますが、someProcess1 はローカルエンコーディングへのユニコード変換を行う必要があります。生の文字列リテラルについては、私にはわかりません。

4

3 に答える 3

7

Unicode を適切に (Python 2.* で) エンコードする必要があることを除けば、「生の文字列」には特定のがないため、処理は必要ありません。これは単なるリテラルの構文、つまり文字列定数の構文であり、コード スニペットに文字列定数があるため、「処理」するものは何もありません。

于 2010-01-17T16:44:33.327 に答える
2

"r" フラグは、Python が文字列内の "\" を解釈するのを防ぐだけです。Web はそれが運ぶデータの種類を気にしないので、あなたの Web 入力はあなたが望む方法で自由に解釈できるバイトの集まりになります。

したがって、この問題に対処するには:

  • ずっと Unicode (例: utf-8) を使用していることを確認してください。
  • 文字列を取得するとUnicodeになり、「\n」、「\t」、「\a」はリテラルになるため、エスケープする必要があるかどうかを気にする必要はありません。
于 2010-01-17T17:06:35.923 に答える
2

最初の例では、次のことに注意してください。

>>> p1 = "pattern"
>>> p2 = u"pattern"
>>> p3 = r"pattern"
>>> p4 = ur"pattern" # it's ur"", not ru"" btw
>>> p1 == p2 == p3 == p4
True

これらの構造は異なって見えますが、すべて同じことを行い、値 " " を含む文字列オブジェクト (p1 と p3 astrおよび p2 と p4 aオブジェクト) を作成します。、およびパーサーに、次の引用符で囲まれた文字列をどのように解釈するか、つまり、他の文字をエンコードするためのバックスラッシュが無視されるUnicode テキスト ( ) および/または生のテキスト ( ) として伝えるだけです。ただし、最終的には、生の文字列であるかどうかにかかわらず、文字列がどのように作成されたかは関係ありません。内部的には同じように保存されます。unicodepatternururur

Unicode テキストを入力として取得する場合、それがunicodeテキストかstrオブジェクトかを (Python 2.x で) 区別する必要があります。Unicode コンテンツを操作する場合は、内部的にそれらのみを操作し、すべてのstrオブジェクトをunicodeオブジェクトに変換する必要があります (ハードコードされたテキストstr.decode()の構文を使用するか、構文を使用して)。u'text'ただし、ローカル エンコーディングにエンコードすると、Unicode シンボルで問題が発生します。

別のアプローチは、Python 3 を使用することです。このstrオブジェクトは、Unicode を直接サポートし、すべてを Unicode として保存し、エンコーディングを気にする必要はありません。

于 2010-01-17T17:10:05.307 に答える