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

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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2490閲覧

u'(?u)\b\w+\b')という正規表現について

hood

総合スコア351

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/02/14 06:49

0

0

###u'(?u)\b\w+\b') という正規表現について
勉強をしている本の中で以下のような正規表現がでてきました。
u'(?u)\b\w+\b')
本には解釈のほうほうがのっていないのですが、私はこれをダブルクォーテーションに囲われた文字列を表しているのだと解釈しました。(\bがダブルクォーテーションを表し、その中にある文字を表す\wがあり、それが続く印の+があるから)

しかし、この中の(?u)というところだけ解釈ができません。
公式ドキュメント
を見ると、なんとなくunicodeが関係するのだとわかるのですが、最初のu''で文字列をunicode(日本語)として解釈しているはずなので(?u)は冗長なのではないのかなどと思ってしまいます。

(?u)はなんの役目を果たしているのか...どうかご教示いただけなら助かります...

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

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

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

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

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

guest

回答1

0

ベストアンサー

最初のu''で文字列をunicode(日本語)として解釈しているはず

誤解されていることがいくつか。

  • uプレフィックスでユニコード指定されているのは正規表現文字列自体であって、探索対象の文字列がユニコードであるか限りません ユニコードの規則に基づいたマッチングを保証するものではありません。そのために (?u) を付与していると思われます。
  • Python3.x以降では、uプレフィックスは不要です。これはPython2.7の仕様の残骸です。(出典1)
  • Python3.x以降では、正規表現に依る文字列の探索はデフォルトでユニコードなので、(?u) は不要です。これはPython2.7の仕様の残骸です。(出典2)

依って、Python3.xならば次のように書けば充分です。

Python

1r'\b\w+\b'

ついでにraw文字列も利用して、冗長なエスケープも排除しました。

結論

書籍が古いのでは。

出典

出典1

Python 3.3 では文字列リテラルへの "u" 前置を再びサポートすることにしました。この前置は Python 3 自身では何らの意味も持ちはせず、Python 3 への移行において純粋な機械的変更を要する事項を単に減らすためだけのために提供されます。

引用元:What's New In Python 3.3 » 明示的なユニコードリテラル

出典2

後方互換性のため、re.U フラグ (と同義の re.UNICODE および埋め込みで使用する (?u)) はまだ存在しますが、Python 3 では文字列のマッチがデフォルトで Unicode (そしてバイト列では Unicode マッチングが扱えない) なので冗長です。

引用元:Python 標準ライブラリ » モジュールコンテンツ

投稿2019/02/14 07:05

編集2019/02/14 07:14
LouiS0616

総合スコア35676

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

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

hood

2019/02/14 09:44

回答ありがとうございます! LouiSさんにはjavaでも回答してもらったことがありますが、pythonも熟練者なのですね... >Python3.x以降では、uプレフィックスは不要 >Python3.x以降では、正規表現に依る文字列の探索はデフォルトでユニコード そうだったんですね... 2018年の本を買ったのですが、筆者はある程度の後方互換がきくようにコードを書いているのかもしれません... 誤解を訂正した上でわかりやすく説明していただき、すっと身に入ってきました!
LouiS0616

2019/02/14 09:59 編集

いえいえ、たまたまどちらも中途半端に齧っただけのアマグラマです。 --- > 筆者はある程度の後方互換がきくようにコードを書いているのかも 好意的に解釈すればそうかもしれませんね。 ただraw文字列はPython2.7でも利用可能なので、私は悪い方に想像が膨らんでしまいます。 応用的な書籍ではしばしば、著者が言語に明るくないことがあります。 まぁ専門外ならばしょうがないと言えばしょうがないのですが。
hood

2019/02/14 11:58

なるほど・・・ そんな傾向もあるんですか・・・とても勉強になります・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問