質問: '\d(.*)(?=.\d)' print(re.match(pattern, text)[0]) ```
回答: > > 0だけ取り出されてしまう理由 > > > `?=`による肯定先読みが`021.tech`の`21`にヒットするからです。 `\d`は数値、`.*`は**0個以上**の任意の文字列です。 私は詳細には語れませんが、pythonの正規表現エンジンでは`.*`の後ろに肯定先読みを配置すると肯定先読みが最大量を読み込むようです。 すなわち`'\d(.*)(?=.\d)'`を`021.tech`に適用すると... 最初の`\d`が0にヒットし、 `(?=.\d)`が2にヒットするので `.*`は0文字の数値にヒットします。 (この挙動は正規表現エンジンによって変わるはずです) 素直な解決策としては`'(.\d+\.\D+)'`など先読みを使わない正規表現が考えられます。 ※`\D`は数字以外の文字列です ``` import re texts = ['01.stack', '021.tech', '01.picture02.zoom'] pattern = '(.\d+\.\D+)' for text in texts: result = re.match(pattern, text) if result: print(text, ':', result[0]) ```