6

私は正規表現に非常に慣れていないので、Pythonを使用して「\」文字を取得しようとしています

通常、私はこのように「\」を脱出することができます

print ("\\");
print ("i am \\nit");

出力

\
i am \nit

しかし、regXで同じものを使用すると、思ったように機能しませんでした

print (re.findall(r'\\',"i am \\nit"));

そして私に出力を返します

['\\']

誰かが理由を説明できますか

4

4 に答える 4

17

編集:問題は実際にprintはリストと文字列でどのように機能するかです。文字列自体ではなく、文字列の表現を出力します。バックスラッシュのみを含む文字列の表現はです'\\'。したがってfindall、実際には単一の円記号を正しく検出しprintていますが、期待どおりに印刷されていません。試す:

>>> print(re.findall(r'\\',"i am \\nit")[0])
\

(以下は私の最初の答えです。無視できます(まったく関係ありません)。最初は質問を誤解していました。しかし、少し賛成されたようですので、ここに残しておきます。)

文字列のrプレフィックスは、文字列が「生」モードにあること、つまり\特殊文字として扱われないことを意味します(「正規表現」とは何の関係もありません)。

ただし、r'\'バックスラッシュで生の文字列を終了することはできないため、機能しません。ドキュメントに記載されています。

生の文字列であっても、文字列の引用符は円記号でエスケープできますが、円記号は文字列に残ります。たとえば、r "\" "は、バックスラッシュと二重引用符の2文字で構成される有効な文字列リテラルです。r" \ "は有効な文字列リテラルではありません(生の文字列でさえ、奇数のバックスラッシュで終了することはできません)。具体的には、生の文字列を単一のバックスラッシュで終了することはできません(バックスラッシュは次の引用文字をエスケープするため)。

ただし、実際には、生でない文字列を使用して単一の円記号を取得できます"\\"

于 2012-04-27T11:09:49.573 に答える
1

誰かが理由を説明できますか

re.findall一致するものが1つ見つかり、一致テキストが円記号で構成されていたためです。それはあなたにバックスラッシュである1つの文字を持っている文字列である1つの要素を持つリストを与えました。

これは、サンプルコードを作成したときと同じように、「バックスラッシュが1つ付いた文字列」を作成する方法で['\\']あるために作成されます。'\\'print "\\"

于 2012-04-27T12:02:22.227 に答える
0

ここでは、2種類の文字列リテラルを使用していることに注意してください。通常の文字列"a string"と生の文字列がありますr"a raw string"。通常の文字列リテラルはバックスラッシュのエスケープを監視するため、実際に文字列にバックスラッシュを入れるには、それもエスケープする必要があります。生の文字列リテラルは他の文字と同じようにバックスラッシュを処理するため、実際に文字列に入力できる文字は制限されますが(エスケープコードを必要とする特殊文字はありません)、正規表現などを入力する方が簡単です。文字列を作成するときだけでなく、文字列内に意味を持つように円記号を追加する必要がある場合は、円記号を2倍にする必要があります。

于 2012-04-27T11:08:16.663 に答える
-2

バックスラッシュが終了引用符の直前にない限り、生の文字列でバックスラッシュをエスケープする必要はありません。

于 2012-04-27T11:04:17.853 に答える