pythonの正規表現についての質問です。
ある学習の中で、「~ / ~」「~ / ~」というような文字列をreモジュールのsplitにて分けるというものがありました。
この際、その学習の中では次のように解説していました。
b = re.split('\s*[//\t]+\s*', a)
※aとbはそれぞれ変数名です。
ここで疑問なのは、なぜ"\s*[///t]+\s*"とせず、\sとし、\sを打ち消しているのでしょうか?
ちなみに、この場合\sでも\sでも同じように動作するため違いがわかりませんでした。
また\sの時、\sは\によって打ち消されるため、\sは文字列として認識されると思ったのですが、そうではないのでしょうか。
回答してくださる方おりましたらよろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
この場合\sでも\sでも同じように動作するため
\sで動作しますか? 試してみたところ、動作しますね。
Python
1import re 2re.compile('\s')
実行結果 Wandbox
prog.py:2: SyntaxWarning: invalid escape sequence \s re.compile('\s')
追記: 警告を例外に見間違えました。とんだ凡ミスです。失礼しました。
ここで疑問なのは、なぜ"\s*[///t]+\s*"とせず、\sとし、\sを打ち消しているのでしょうか?
リファレンスに解説があります。
正規表現では、特殊な形式を表したり、特殊文字の持つ特別な意味を呼び出さずにその特殊な文字を使えるようにするために、バックスラッシュ文字 ('') を使います。こうしたバックスラッシュの使い方は、 Python の文字列リテラルにおける同じバックスラッシュ文字と衝突を起こします。例えば、バックスラッシュ自体にマッチさせるには、パターン文字列として '\' と書かなければなりません、というのも、正規表現は \ でなければならず、さらに正規な Python 文字列リテラルでは各々のバックスラッシュを \ と表現せねばならないからです。
正規表現パターンに Python の raw string 記法を使えばこの問題を解決できます。 'r' を前置した文字列リテラル内ではバックスラッシュを特別扱いしません。従って、 "\n" が改行一文字の入った文字列になるのに対して、 r"\n" は '' と 'n' という二つの文字の入った文字列になります。通常、 Python コード中では、パターンをこの raw string 記法を使って表現します。
引用元:Python 標準ライブラリ » re — 正規表現操作
『\で\sを打ち消している』のではなく、『\sで\sを表現している』ですかね。
assert '\s' == '\s' の謎
標準の C とは違い、認識されなかったエスケープシーケンスはすべて、そのまま文字列中に残ります。すなわち、バックスラッシュも結果中に残ります。(この挙動はデバッグの際に便利です: エスケープシーケンスが誤入力されたら、その出力結果が失敗しているのが分かりやすくなります。) 文字列中でのみ認識されるエスケープシーケンスは、バイト列リテラルには、認識されないエスケープシーケンスとして分類されるので注意してください。
バージョン 3.6 で変更: 認識されないエスケープシーケンスには DeprecationWarning が出ます。将来どこかのバージョンの Python で、認識されないエスケープシーケンスは SyntaxError になるでしょう。
便利かこれ...?
Python
1assert '\s' == '\s' 2print('s is ok') 3 4assert '\t' == '\t' 5print('t is ok')
s is ok Traceback (most recent call last): File "prog.py", line 4, in <module> assert '\t' == '\t' AssertionError
投稿2019/02/13 07:45
編集2019/02/13 08:06総合スコア35676
0
ベストアンサー
python文字列そのもののエスケープシーケンスがあるため、\
を表現するためには\
と書かないと危ないからです。
たとえば
python
1>>> print("\t") # \tと表示 2\t 3>>> print("\t") # tab文字が出てくる。 4
まあ、\s
というエスケープシーケンスはないので、その場合はどちらでも同じになるのかな? というような気もしますが・・・ちょっと詳細は不明。
なお、文字列の先頭にr
をつけてr"文字列"
のようにすると、エスケープシーケンスが効かなくなり書いた通りの文字列になるので、余計な手間が省けます。読みやすいので、正規表現をするときはだいたいこれを使うと思います。
python
1>>> print(r"\t") 2\t 3>>> print(r"\t") 4\t
投稿2019/02/13 07:49
編集2019/02/13 07:52総合スコア30939
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/13 07:51
2019/02/13 07:52
2019/02/13 07:56
2019/02/13 08:13