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

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

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

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

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

Q&A

解決済

3回答

762閲覧

python・正規表現の挙動がわからない

Newcomer_DS

総合スコア15

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

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

0グッド

0クリップ

投稿2020/02/02 12:02

編集2020/02/02 12:19

下記のコードを実行した際に、なぜoutputが私の予想通りにならないのかがわかりません。

python

1import re 2 3exampleString = ''' 4Jessica is 15 years old, and Daniel is 27 years old. 5Edward is 97 years old, and his grandfather, Oscar, is 102. 6''' 7ages = re.findall(r'\d{1,2}',exampleString) 8print(ages) 9

私の期待している出力: '15', '27', '97'
実際の出力: '15', '27', '97', '10', '2'

質問を整理すると、2つあります。

  1. \d{1,2}を実行すると、なぜ、102が10と2で分解されて出てくるのか?
  2. exampleStringから、2桁の数字だけを取り出すには、どのように正規表現を表現したら良いか?

よろしくお願いいたします。

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

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

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

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

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

can110

2020/02/02 12:16

タグに「正規表現」を加えると、より多くの人に目に留まり回答が得られやすくなります。
Newcomer_DS

2020/02/02 12:19

アドバイスありがとうございます
guest

回答3

0

exampleStringから、2桁の数字だけを取り出すには、どのように正規表現を表現したら良いか?

正規表現以外の機能も適宜活用すると、簡潔に・拡張し易くコードを書けそうです。

Python

1ages = [ 2 digits for digits in re.findall(r'\d+', exampleString) 3 if len(digits) == 2 4]

アピールポイント

  • 正規表現が簡潔で、一目見れば意図が理解できる
  • 文頭や文末などを特別に処理する必要が無い
  • 『2ケタあるいは3ケタ』のような指定も簡単 if len(digits) in (2, 3)

投稿2020/02/02 13:00

LouiS0616

総合スコア35668

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

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

0

'\d{1,2}'は'102'の先頭の2文字'10'にマッチします。その後'2'にもマッチします。
'102'にはマッチしませんが、'10'と'2'にマッチします。

Python

1ages = re.findall(r'\D\d{1,2}\D',exampleString) 2print(ages) 3#[' 15 ', ' 27 ', ' 97 ']

投稿2020/02/02 12:20

meg_

総合スコア10760

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

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

0

ベストアンサー

1については雑に云うと「そういうもの」としか回答できません。
findallは指定された正規表現にマッチする文字列を複数返しますが
「102」において「10」と「2」の部分はどちらも\d{1,2}にマッチするので、どちらも返されます。
これは「10abc2」でも同じ結果になるのと同じ動作です。
2については[^\d]\d{1,2}[^\d]のように前後に「数値以外」という表現をつけると意図した結果が得られます。

投稿2020/02/02 12:19

編集2020/02/02 12:21
can110

総合スコア38341

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問