80543


example:

  * 01.stack
  * 021.tech
  * 01.picture02.zoom

これらから以下を取り出したいです。

  * 01.stack
  * 021.tech
  * 01.picture

現状 `\d(.*)(?=.\d)` の正規表現が思いついたのですが、この正規表現だと2つめのtechで0だけ取り出されてしまします。  
０だけ取り出されてしまう理由と、解決する正規表現をご教授いただいきたいです。

ツールとしては Python の re ライブラリを使用します。

[code]

    import re
    text = '01.picture02.zoom'
    pattern = '\d(.*)(?=.\d)'
    print(re.match(pattern, text)[0])
    
[/code]


CC BY-SA 4.0
2021-08-02T06:45:35.020
80538
2021-08-02T08:45:15.400
2021-08-02T07:53:57.307
3060
29536
question
python 正規表現
正規表現　数字＋文字列＋数字＋文字列　から最初の数字＋文字列を取り出したい


> ０だけ取り出されてしまう理由

`?=`による肯定先読みが`021.tech`の`21`にヒットするからです。  
`\d`は数値、`.*`は **0個以上** の任意の文字列です。

私は詳細には語れませんが、pythonの正規表現エンジンでは`.*`の後ろに肯定先読みを配置すると肯定先読みが最大量を読み込むようです。  
すなわち`'\d(.*)(?=.\d)'`を`021.tech`に適用すると…  
最初の`\d`が0にヒットし、  
`(?=.\d)`が2にヒットするので  
`.*`は0文字の数値にヒットします。  
(この挙動は正規表現エンジンによって変わるはずです)

素直な解決策としては`'(.\d+\.\D+)'`など先読みを使わない正規表現が考えられます。  
※`\D`は数字以外の文字列です

[code]

    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])
    
[/code]


CC BY-SA 4.0
2021-08-02T08:45:15.400
80543
2021-08-02T08:45:15.400
9820
80538
answer