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

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

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

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

Q&A

解決済

3回答

490閲覧

match について

NightElf00

総合スコア7

Python

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

0グッド

0クリップ

投稿2019/09/25 05:52

pythonのライブラリを読んで、正規表現についてわからないことを質問します。
https://docs.python.org/ja/3/library/re.html

python

1m = re.match(r"(\d+).(\d+)", "24.1632") 2print(m.groups())

結果:('24', '1632')

私の考え方:
\d は数字
\d+ は一つ以上の数字
. は.

よって、
((\d+).(\d+)) は 一つ以上の数字.一つ以上の数字 のように、小数点が必ず入るものだと思います。
私が考えた結果は ('24.1', '24.1632' , '4.1', '4.163', ...)

なぜm.groupsの結果は小数点がない数字、さらに2つしかありませんか?

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

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

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

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

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

guest

回答3

0

本来なら \d+.\d+ で充分なところ、 () でキャプチャを取っているからです。
このことはご参照のリファレンスにも、また違った表現で書いてありますね。

#####Match.groups(default=None)

このマッチの、1 からパターン中のグループ数まで、全てのサブグループを含むタプルを返します。


私が考えた結果は ('24.1', '24.1632' , '4.1', '4.163', ...)

matchは先頭から探索します。ですので、4から始まることはあり得ません。
またできるだけ長くマッチしようとするので、小数点以下が途中で打ち切られることもありません。

途中から探索したい場合はre.searchを、常に文字列全体とマッチしたい場合はre.fullmatchを使えます。
ただし今回の場合どれを選んでも結果は同じです。


なお m.group(0) とでもすれば、マッチした文字列全体が得られます。

Python

1>>> pattern = re.compile(r'(\d+).(\d+)') 2>>> 3>>> m = pattern.match(r'24.1632') 4>>> for i in range(pattern.groups+1): 5... print(i, m.group(i)) 6... 70 24.1632 81 24 92 1632

投稿2019/09/25 06:01

編集2019/09/25 06:13
LouiS0616

総合スコア35658

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

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

NightElf00

2019/09/25 06:54

re.searchとre.fullmatchもありますね!ありがとうございました。!
guest

0

ベストアンサー

正規表現ではパターン文字列の一部を() で囲う(グループ化)ことでマッチした文字列の一部を抜き出すことができます。

今回の質問の例では
"(\d+).(\d+)"
となっており、少数点より前の\d+ と、少数点より後の\d+ がそれぞれも括弧で囲まれておりますので、それぞれグループ1、グループ2 に割り当てられます。(パターン文字列全体がグループ0 に割り当てられる)

で、これらの結果はは m.group() により得ることができます。(m.groups() では ありませんので注意してください)。

Python

1import re 2m = re.match(r"(\d+).(\d+)", "24.1632") 3# グループ0(パターン文字全体) 4print(m.group(0)) 524.1632 6# グループ1(小数点より前) 7print(m.group(1)) 824 9# グループ2(小数点より後) 10print(m.group(2)) 111632

で、今回の質問となっているm.groups() ですが、これはグループ1以降の全サブグループ(全体以外)タプルでを返すAPI ですので、上記のグループ1の結果とグループ2の結果がタプルで返ります。

Python

1print(m.groups()) 2# ('24', '1632')

https://docs.python.org/ja/3/library/re.html#re.Match.groups

投稿2019/09/25 06:28

magichan

総合スコア15898

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

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

NightElf00

2019/09/25 06:50

わかりやすく説明していただきありがとうございました!
guest

0

((\d+).(\d+)) は 一つ以上の数字.一つ以上の数字 のように、小数点が必ず入るものだと思います。

しかし貴方のコードには外側のカッコがありません。

私が考えた結果は ('24.1', '24.1632' , '4.1', '4.163', ...)

マッチする文字列が複数通り考えられるときは最長・最左のものが採用されるというルールがあるので、そうはなりません。

投稿2019/09/25 06:06

KojiDoi

総合スコア13669

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問