

# したいこと

Python上で正規表現を使って、時刻と日本語が混ざった文字列から時刻を抽出したい。

# 現状

時刻の時間部分のみ抽出されて、全体が上手く取れない。

# コード

[code]

    import re
    
    time_str = '10:19発→11:50着1時間31分'
    times = re.findall(r'([01][0-9]|2[0-3]):[0-5][0-9]', time_str)
    print(times)
    
[/code]

# 現状の出力

`['10', '11']`

# 理想の出力

`['10:19', '11:50']`

# 環境

Python 3.8.2 (pyenv上）  
macOS 11.6.1

正規表現・Stack Overflowともに初心者ですので不備がありましたらご指摘をお願いします。よろしくお願い致します。


CC BY-SA 4.0
2022-01-02T12:09:26.080
85446
2022-01-02T12:59:00.130
38402
question
python 正規表現
Python上で正規表現を使って文字列から時刻を抽出する方法

[code]

    import re
    
    time_str = '10:19発→11:50着1時間31分'
    times = re.findall(r'((?:[01][0-9]|2[0-3]):[0-5][0-9])', time_str)
    print(times)  # ['10:19', '11:50']
    
[/code]


CC BY-SA 4.0
2022-01-02T12:29:51.933
85447
2022-01-02T12:29:51.933
41756
85446
answer


質問文にある例が想定通りに動いていないのは、カッコを使ってキャプチャしているグループが最初 2 桁の数字部分しか無いためです。

たとえば雑に次のように書けます。

[code]

    import re
    
    time_str = '10:19発→11:50着1時間31分'
    times = re.search(r'([0-9]{1,2}:[0-9]{2})発→([0-9]{1,2}:[0-9]{2})着', time_str)
    if times:
        print(times.groups())
    
[/code]

なお、このままだとタプルが出力されますが、リストの方が良いのであれば `list(times.groups())` を使ってください。


CC BY-SA 4.0
2022-01-02T12:31:36.380
85448
2022-01-02T12:31:36.380
19110
85446
answer


[正規表現のシンタックス](https://docs.python.org/ja/3/library/re.html#regular-expression-
syntax)

> `(?:...)`
>
>
> 普通の丸括弧の、キャプチャしない版です。丸括弧で囲まれた正規表現にマッチしますが、このグループがマッチした部分文字列は、マッチを実行したあとで回収することも、そのパターン中で以降参照することも
> できません 。
[code]

    import re
    
    time_str = '10:19発→11:50着1時間31分'
    times = re.findall(r'((?:[01][0-9]|2[0-3]):[0-5][0-9])', time_str)
    print(times)
    
    #
    ['10:19', '11:50']
    
[/code]


CC BY-SA 4.0
2022-01-02T12:59:00.130
85449
2022-01-02T12:59:00.130
47127
85446
answer