teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記を追加

2021/09/17 10:15

投稿

etherbeg
etherbeg

スコア1195

answer CHANGED
@@ -22,6 +22,8 @@
22
22
 
23
23
  この問題を軽減するために導入されたのが、Raw 文字列です。正規表現パターンに Raw 文字列を使うと、文字列リテラル一般におけるバックスラッシュの働きに頭を煩わせることなく、正規表現エンジンにおけるバックスラッシュの扱いのみに集中することができます。
24
24
 
25
+ (追記:別の言い方をすれば、正規表現パターンにバックスラッシュを含んでいなければ、Raw 文字列であろうと普通の文字列であろうと、どちらでもいっしょ、ということでもあります。)
26
+
25
27
  以下は公式ドキュメントからの引用です。
26
28
 
27
29
  > 正規表現では、特殊な形式を表すためや、特殊文字をその特殊な意味を発動させず使うために、バックスラッシュ文字 ('\') を使います。こうしたバックスラッシュの使い方は、 Python の文字列リテラルにおける同じ文字の使い方と衝突します。例えば、リテラルのバックスラッシュにマッチさせるには、パターン文字列として '\\' と書かなければなりません。なぜなら、正規表現は \ でなければならないうえ、それぞれのバックスラッシュは標準の Python 文字列リテラルで \ と表現せねばならないからです。 (後略)

1

説明の追加

2021/09/17 10:15

投稿

etherbeg
etherbeg

スコア1195

answer CHANGED
@@ -6,4 +6,25 @@
6
6
  - [Python ドキュメント » Python 標準ライブラリ » テキスト処理サービス » re --- 正規表現操作 » Raw 文字列記法](https://docs.python.org/ja/3/library/re.html#raw-string-notation)
7
7
  - [Python ドキュメント » Python よくある質問 » なぜ raw 文字列 (r-strings) はバックスラッシュで終わってはいけないのですか?](https://docs.python.org/ja/3/faq/design.html?#why-can-t-raw-strings-r-strings-end-with-a-backslash)
8
8
 
9
- [*1]: [https://docs.python.org/ja/3/faq/design.html?#why-can-t-raw-strings-r-strings-end-with-a-backslash](https://docs.python.org/ja/3/faq/design.html?#why-can-t-raw-strings-r-strings-end-with-a-backslash)
9
+ [*1]: [https://docs.python.org/ja/3/faq/design.html?#why-can-t-raw-strings-r-strings-end-with-a-backslash](https://docs.python.org/ja/3/faq/design.html?#why-can-t-raw-strings-r-strings-end-with-a-backslash)
10
+
11
+ ---
12
+
13
+ Raw 文字列は、文字列リテラル一般における「バックスラッシュ」の機能(他のアルファベットや数字と組み合わされることによりエスケープシーケンスを構成する機能)を無効化するためのものです。
14
+
15
+ 正規表現では検索パターンを文字列リテラルを使って表します。正規表現では [], +, $ などの特殊文字に加えて、バックスラッシュも特殊文字として検索パターン内で使用します。
16
+
17
+ [], +, $ などの特殊文字は、通常の文字列リテラルにおいては特殊文字ではなく、正規表現の処理過程においてのみ特殊文字として扱われます。しかしバックスラッシュは、文字列リテラルにおいても、正規表現の処理過程においても、特殊文字として扱われます。
18
+
19
+ 正規表現パターンに含まれるバックスラッシュは、正規表現エンジンに渡される前に、Pythonによってエスケープシーケンスとして認識され、その後に正規表現エンジンによって正規表現パターンにおける特殊文字として認識されるという、二重の過程を経ます。
20
+
21
+ この二重の過程に対処するために、バックスラッシュが含まれる正規表現は、連続するバックスラッシュを含む複雑なものになるなど、理解しにくくなることがあります(常にそうなるわけではありません)。
22
+
23
+ この問題を軽減するために導入されたのが、Raw 文字列です。正規表現パターンに Raw 文字列を使うと、文字列リテラル一般におけるバックスラッシュの働きに頭を煩わせることなく、正規表現エンジンにおけるバックスラッシュの扱いのみに集中することができます。
24
+
25
+ 以下は公式ドキュメントからの引用です。
26
+
27
+ > 正規表現では、特殊な形式を表すためや、特殊文字をその特殊な意味を発動させず使うために、バックスラッシュ文字 ('\') を使います。こうしたバックスラッシュの使い方は、 Python の文字列リテラルにおける同じ文字の使い方と衝突します。例えば、リテラルのバックスラッシュにマッチさせるには、パターン文字列として '\\' と書かなければなりません。なぜなら、正規表現は \ でなければならないうえ、それぞれのバックスラッシュは標準の Python 文字列リテラルで \ と表現せねばならないからです。 (後略)
28
+
29
+ > これを解決するには、正規表現パターンに Python の raw 文字列記法を使います。 'r' を前置した文字列リテラル内ではバックスラッシュが特別扱いされません。従って "\n" が改行一文字からなる文字列であるのに対して、 r"\n" は '\' と 'n' の二文字からなる文字列です。通常、 Python コード中では、パターンをこの raw 文字列記法を使って表現します。
30
+ [https://docs.python.org/ja/3/library/re.html#module-re](https://docs.python.org/ja/3/library/re.html#module-re)