38281


「国語20数学30」から20+30=50を求めたい。データには、このペアが1000件ほど存在します。  
re.matchを使えると思うのですが、どうもうまく行きません。ヒントをご教示頂けるとありがたいです。

reを使わないバージョンですが、現在のところ、下記のように書いているのですが、  
うまく行きません。

[code]

    import pandas as pd 
    import numpy as np
    
    df = pd.DataFrame(
        {'x': ['国語20数学60', '160', '国語100数学20']},
        index=[1, 2, 3])
    
    # index no.2には、国語と数学の合計点が入っています。 
    
    print(df)
    
    df['total'] = np.zeros((len(df),1))  
    lang = list(range(1, 101))  
    math  =list(range(1, 101))  
    for s_lang in lang :
        for s_math in math :
            for i in range(len(df)):
                if ("国語%d数学%d" %(s_lang,s_math)) in df['x'][i]:   
                  df['total'][i] = s_lang+s_math
                else:
                    df['total'][i] =df['x'][i] 
    
    print(df)
    
[/code]


CC BY-SA 3.0
2017-09-28T20:42:50.853
38276
2017-09-30T11:27:06.190
2017-09-30T11:27:06.190
20148
20148
question
python
文字列から数値を抽出し、合計したい


pythonは「int」関数で文字列を10進数の整数に変換する事ができます。

また、そのような文字列では[数値の抽出にre.matchを使えません](https://qiita.com/wrblue_mica34/items/9253d6ba7e0baf5cc714
"Qiita内の『正規表現で数値を抽出』より。")。


CC BY-SA 3.0
2017-09-29T00:14:57.237
38277
2017-09-29T00:14:57.237
18660
38276
answer


正規表現で数値(の文字列)を抽出し、それをint関数で数値に変えて加算すればよいのではないでしょうか。

正規表現で数値(の文字列)を抽出の部分は、以下のような感じ

[code]

    #正規表現のモジュールをインポートしておく
    import re
    
    #数値にマッチするパターン（0～9の文字(数字)の繰り返し)を定義
    pattern=r'([0-9]*)'
    
    #元の文字列が変数textに入っているものとすると、re.findallを使ってlistsに数値を表す文字列のリストが得られる
    lists=re.findall(pattern,text)
    
[/code]

textの内容が'国語20数学30'だとすると、lists=['20','30']となるはず。

文字列を数値に変えて加算する部分は簡単だと思うので省略。


CC BY-SA 3.0
2017-09-29T01:35:29.450
38281
2017-09-29T01:35:29.450
217
38276
answer


pythonを使わない方法なら、

方法1.エクセルで正規表現を使う。  
(参考)Excelのワークシート関数で正規表現を使う  
<https://qiita.com/ktyubeshi/items/74228f18498224c7427d>  
A1を国語20数学30  
B1を=RegExp(A1,"(\D+)(\d+)(\D+)(\d+)",2-1)+RegExp(A1,"(\D+)(\d+)(\D+)(\d+)",4-1)

方法2.エクセルの関数を使う。  
.(参考)エクセルで特定の文字の前までを取り出す、特定の文字以降を取り出す  
<https://qiita.com/yuwaita/items/b7445bcc7b09c143fcf7>  
A1を国語20数学30  
B1を=MID(LEFT(A1,FIND("数学",A1)-1),3,LEN(A1))+MID(RIGHT(A1,LEN(A1)-(FIND("数学",A1)-1)),3,LEN(A1))

方法3,"数学"と"国語"を","に置き換え後、csvファイルにする。("数学"と"国語"を"数学,"と"国語,"に置換して、csvファイルにする。)  
csvファイルをエクセルで読む。


CC BY-SA 3.0
2017-09-29T16:02:30.930
38307
2017-09-29T16:02:30.930
17199
38276
answer