質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

428閲覧

pythonの正規表現について

sho_00

総合スコア4

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/14 11:19

編集2021/09/16 01:01

気になったので教えていただきたいです

フォーマット済み文字リテラルでよくfを使用しますが、
下記のrはなんでしょうか?

該当のソースコード

python3

1if not re.search(r'^[0-9,]+$', value)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikapy

2021/09/14 11:23

python raw でググればよいかも
ppaul

2021/09/14 12:16

r'^[0-9,]+$'はフォーマット済み文字リテラルではありませんので、質問のタイトルを変更したほうが良いと思います。
guest

回答3

0

ベストアンサー

raw 文字列は、独自にバックスラッシュの処理をしようとするプロセッサ (主に正規表現エンジン) への入力を生成しやすいように設計されたものです*1

他の方がすでに案内されているドキュメントと併せて、次のドキュメントも読まれるとよいでしょう。


Raw 文字列は、文字列リテラル一般における「バックスラッシュ」の機能(他のアルファベットや数字と組み合わされることによりエスケープシーケンスを構成する機能)を無効化するためのものです。

正規表現では検索パターンを文字列リテラルを使って表します。正規表現では [], +, $ などの特殊文字に加えて、バックスラッシュも特殊文字として検索パターン内で使用します。

[], +, $ などの特殊文字は、通常の文字列リテラルにおいては特殊文字ではなく、正規表現の処理過程においてのみ特殊文字として扱われます。しかしバックスラッシュは、文字列リテラルにおいても、正規表現の処理過程においても、特殊文字として扱われます。

正規表現パターンに含まれるバックスラッシュは、正規表現エンジンに渡される前に、Pythonによってエスケープシーケンスとして認識され、その後に正規表現エンジンによって正規表現パターンにおける特殊文字として認識されるという、二重の過程を経ます。

この二重の過程に対処するために、バックスラッシュが含まれる正規表現は、連続するバックスラッシュを含む複雑なものになるなど、理解しにくくなることがあります(常にそうなるわけではありません)。

この問題を軽減するために導入されたのが、Raw 文字列です。正規表現パターンに Raw 文字列を使うと、文字列リテラル一般におけるバックスラッシュの働きに頭を煩わせることなく、正規表現エンジンにおけるバックスラッシュの扱いのみに集中することができます。

(追記:別の言い方をすれば、正規表現パターンにバックスラッシュを含んでいなければ、Raw 文字列であろうと普通の文字列であろうと、どちらでもいっしょ、ということでもあります。)

以下は公式ドキュメントからの引用です。

正規表現では、特殊な形式を表すためや、特殊文字をその特殊な意味を発動させず使うために、バックスラッシュ文字 ('') を使います。こうしたバックスラッシュの使い方は、 Python の文字列リテラルにおける同じ文字の使い方と衝突します。例えば、リテラルのバックスラッシュにマッチさせるには、パターン文字列として '\' と書かなければなりません。なぜなら、正規表現は \ でなければならないうえ、それぞれのバックスラッシュは標準の Python 文字列リテラルで \ と表現せねばならないからです。 (後略)

これを解決するには、正規表現パターンに Python の raw 文字列記法を使います。 'r' を前置した文字列リテラル内ではバックスラッシュが特別扱いされません。従って "\n" が改行一文字からなる文字列であるのに対して、 r"\n" は '' と 'n' の二文字からなる文字列です。通常、 Python コード中では、パターンをこの raw 文字列記法を使って表現します。

https://docs.python.org/ja/3/library/re.html#module-re

投稿2021/09/15 03:47

編集2021/09/17 10:15
etherbeg

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sho_00

2021/09/16 01:12

とても丁寧にご回答いただきありがとうございました。 正規表現の特殊文字を普通の文字列と扱うためのrという理解をしました。 今回のr以降は、valueの中身が数字と,で構成されているかの確認なのですが、 これですと、[]、+、$も通常の文字列と認識されてしまわないのでしょうか?
etherbeg

2021/09/17 02:59

Raw 文字列によって普通の文字列として扱われる特殊文字は、「バックスラッシュ」のみです。[], +, $ などが Raw 文字列によって通常の文字列として認識されることはありません。私も完全に理解できているわけではないのですが、可能な範囲で回答に説明を追記しました。
sho_00

2021/09/21 13:02

お返事が遅くなり申し訳ありません。とても良く理解出来ました。ありがとうございました。
guest

0

otnさんが書かれている公式ドキュメントをよく読んで理解してください。

例としては、以下の違いを理解してください。

python

1>>> print('Hello\nPython') 2Hello 3Python 4>>> print(r'Hello\nPython') 5Hello\nPython

投稿2021/09/14 12:20

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

投稿2021/09/14 11:42

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問