

python3.10で下記のような文章からデータを取得したいのですが、繰り返しで順に数字を取得する方法はありますでしょうか。

〇本文  
イベントA参加人数10人 時間：18:00〜21:00、イベントB参加人数5人 時間：18:00〜21:00

〇補足  
本文をaとして格納しています。

〇取得したいデータ  
人数：10と5

[code]

    print(a.count('参加人数'))
    joinuser_count = a.count('参加人数')
    for i in range(joinuser_count):
        pos = a.find('参加人数')
        b =a[pos:]
        pos2 = b.find('人')
        c = b[:pos2]
    
[/code]

上と合わせてこちらの開始時間・終了時間も取得したいのですが分割の際に「～」が判別できず分割が出来ません。  
特殊文字を置換すると「:」も影響を受けてしまうため判別する方法を知りたいです。

[code]

    time_get = a.find('~')
    time_get_start = a[:time_get]
    
[/code]

簡単な内容かと思い色々検索をかけたのですが改善策が見つからずご教授いただきたいです。


CC BY-SA 4.0
2022-03-31T04:17:11.240
88119
2022-03-31T14:17:55.857
45216
question
python python3
重複文字の後ろのデータを順に取得・時間のデータを取得する方法


問題点がいくつかあります

  * "参加人数" で探し, その位置から文字列 "人"を探すと "人数"の文字位置が返るはずなので, 数字を得るのに適していない
  * ループ内 二度目の処理でも, 同じ sub-stringを扱ってしまうかもしれない
  * 全角の "〜" と, 半角の '~' の混同

[code]

    a = 'イベントA参加人数10人　時間：18:00〜21:00、イベントB参加人数5人　時間：18:00〜21:10'
    for _ in range(a.count('参加人数')):
        k = '参加人数'
        p = a.find(k)
        if p >= 0:
            a = a[p +len(k):]   # findで指定した文字列 "参加人数" 自体は含まないようにする
        p = a.find('人')
        if p >= 0:
            mbr = a[:p]
            print(f'人数 {mbr}')
        p = a.find('〜')
        if p >= 0:
            print(a[p-5: p+1+5])
    
[/code]

* * *

regular expression (あるいは regex, 正規表現) ではこのような処理を比較的簡易に扱うことができます

  * 使い慣れないと, かえって面倒な記述をしてしまい `str.find` など使ったほうがいい場合も出てくるので, 正しく取捨選択
  * 大抵は [str](https://docs.python.org/ja/3/library/stdtypes.html#str) 使うよりも遅い

[code]

    import re
    a = 'イベントA参加人数10人　時間：18:00〜21:00、イベントB参加人数5人　時間：18:00〜21:10'
    mbr = r'参加人数(\d+)人'
    tm = r'\d\d:\d\d〜\d\d:\d\d'
    
    for m in re.finditer(mbr, a):
        print(f'人数 {m[1]}')
    
        b = a[m.end():]
        m = re.search(tm, b)
        if m:
            print(m[0])
    
[/code]

参考: (docs.python.org) [re ---
正規表現操作](https://docs.python.org/ja/3/library/re.html)


CC BY-SA 4.0
2022-03-31T06:24:22.963
88120
2022-03-31T06:24:22.963
43025
88119
answer

[code]

    import re
    
    text = '''
    イベントA参加人数10人　時間：18:00〜21:00、イベントB参加人数5人　時間：18:00〜21:00
    '''.strip()
    
    for m in re.finditer(
                 r'イベント.+?参加人数(?P<参加人数>\d+)人.*?'
                 r'時間：(?P<開始時間>\d{2}:\d{2})〜(?P<終了時間>\d{2}:\d{2})',
                 text):
        print(m.groupdict())
    
    #
    {'参加人数': '10', '開始時間': '18:00', '終了時間': '21:00'}
    {'参加人数': '5', '開始時間': '18:00', '終了時間': '21:00'}
    
[/code]


CC BY-SA 4.0
2022-03-31T14:17:55.857
88124
2022-03-31T14:17:55.857
47127
88119
answer