

Outlookのメール本文より必要な情報のみを抽出したいと考えております。  
抽出したい部分に数字(最大で5桁の整数と少数第1位)と記号が混在していて現在数字のみ抽出できている状態です。  
どちらにでも対応できるような正規表現の書き方をご教示いただけると幸いです。

[code]

    import pandas as pd
    import re
    
    data = """名前:\r\nsatou:\r\n前回の点数 : 14686.5 点\r\n今回の点数 : 8992.5 点\r\n\r\n名前:\r\ntanaka:\r\n前回の点数 : 778.5 点\r\n今回の点数 : 82.5 点\r\n\r\n名前:\r\nsuzuki:\r\n前回の点数 : - 点\r\n今回の点数 : 9.5 点\r\n\r\n"""
    
    ptn = r"名前:\r\n(.*?):\r\n前回の点数\s:\s*([\d.]+)\s*点\r\n今回の点数\s:\s*([\d.]+)\s*(\w+)"
    output_data = pd.DataFrame(re.findall(ptn, data, re.M | re.DOTALL))
    
    output_data = output_data.rename(columns={0:"名前", 1:"前回の点数", 2:"今回の点数", 3:"単位"})
    
[/code]


CC BY-SA 4.0
2022-04-12T04:47:06.173
88286
2022-04-12T13:27:35.957
2022-04-12T11:57:09.407
3060
44772
question
python 正規表現
Pythonの正規表現を使用して文字列から特定箇所の抽出をしたい


suzukiさんの「前回の点数 : -
点」を正規表現で抽出できないことが問題点でしたら、`([\d.]+)`を数字だけでなくマイナス記号に適合するよう書き換えることで対応可能です。

  * 変更前 
    * `点数\s:\s*([\d.]+)\s*`
  * 変更例1 
    * `点数\s:\s*([\d.]+|-)\s*`  
小数または - に適合します。ただし "1.2.3" などにもヒットします。

  * 変更例2 
    * `点数\s:\s*(\d{1,5}\.\d?|-)\s*点`  
1桁～5桁の整数 + 小数点以下1桁または - に適合します。整数のみの場合はヒットしません。

  * 変更例3 
    * `点数\s:\s*(\d{1,5}(?:\.\d)?|-)\s*点`  
1桁～5桁の整数 + 小数点以下1桁または - に適合します。整数のみの場合もヒットします。


CC BY-SA 4.0
2022-04-12T06:40:40.583
88289
2022-04-12T06:40:40.583
9820
88286
answer

[code]

    import pandas as pd
    import re
    
    pd.set_option('display.unicode.east_asian_width', True)
    
    data = """名前:\r\nsatou:\r\n前回の点数 : 14686.5 点\r\n今回の点数 : 8992.5 点\r\n\r\n名前:\r\ntanaka:\r\n前回の点数 : 778.5 点\r\n今回の点数 : 82.5 点\r\n\r\n名前:\r\nsuzuki:\r\n前回の点数 : - 点\r\n今回の点数 : 9.5 点\r\n\r\n"""
    
    output_data = (
        pd.DataFrame([
            m.groupdict() for m in re.finditer(
                r'名前:\r\n(?P<名前>.+?):\r\n'
                r'前回の点数\s:\s*(?P<前回の点数>.+?)\s*点\r\n'
                r'今回の点数\s:\s*(?P<今回の点数>.+?)\s*'
                r'(?P<単位>\w+)(?=\r\n)', data)]))
    
    print(output_data)
    
    #
         名前 前回の点数 今回の点数 単位
    0   satou    14686.5     8992.5   点
    1  tanaka      778.5       82.5   点
    2  suzuki          -        9.5   点
    
[/code]


CC BY-SA 4.0
2022-04-12T13:27:35.957
88299
2022-04-12T13:27:35.957
47127
88286
answer