2015-12-16 10 views
6

このコードの私の目的は、すべての整数をテキストから抽出し、それらを合計することです。Pythonのテキスト内で整数のすべての出現を見つける

私は、テキストの行にあるすべての整数を抜き出すためのソリューションを探していました。私は\D\bを使用することを提案するいくつかのソリューションを見ましたが、私はちょうど正規表現で始まっていて、それが自分のコードにどのように適合するかまだよく知られていません。ただ、適用urllib2.urlopenの戻り値は文字列ではなく、接続オブジェクト(ファイルオブジェクト)

  • ;あなたはurllib2.urlopenの戻り値のreadを呼び出す必要がある:(

    import re 
    import urllib2 
    
    data = urllib2.urlopen("http://python-data.dr-chuck.net/regex_sum_179860.txt") 
    aList = [] 
    
    for word in data: 
        data = (str(w) for w in data) 
        s = re.findall(r'[\d]+', word) 
        if len(s) != 1: continue 
        num = int(s[0]) 
        aList.append(num) 
    
    print aList 
    
  • +1

    あなたのループ? –

    +0

    リンクをチェックアウトすることはできますが、数字のほとんどは空白で区切ります – Kelvinlimjk

    答えて

    4

    あなたは、行ごとにそれを行うあなたの出力リスト1桁以上の数字のためのパターン"\d+"を利用し、拡張findallを呼び出すことができます。

    import re 
    import urllib2 
    
    data = urllib2.urlopen("http://python-data.dr-chuck.net/regex_sum_179860.txt") 
    r = re.compile("\d+") 
    l = [] 
    for line in data: 
        l.extend(map(int,r.findall(line))) 
    

    出力:

    [3524, 9968, 6177, 3133, 6508, 7940, 3738, 1112, 6179, 4570, 6127, 9150, 9883, 418, 3538, 2992, 8527, 1150, 2049, 2834, 2630, 3840, 2638, 3800, 9144, 5866, 6742, 588, 6918, 7802, 8229, 7947, 8992, 1339, 
    2119, 846, 3820, 4070, 9356, 9708, 3238, 9380, 5572, 9491, 3038, 
    7434, 7771, 288, 8632, 3962, 9136, 8106, 7295, 3699, 4136, 3459, 8120, 
    6018, 8963, 5779, 3635, 3984, 4850, 9633, 2588, 7631, 9591, 1067, 
    7182, 1301, 8041, 1361, 5425, 8326, 7094, 8155, 2581, 7199, 6125, 42] 
    

    str.isdigit

    l = [] 
    for line in data: 
        l.extend(map(int,(w for w in line.split() if w.isdigit()))) 
    

    あなただけの数字をsumしたい場合は、すべてですべての数値を格納する必要はありません。

    print(sum(sum(map(int,(w for w in line.split() if w.isdigit()))) for line in data)) 
    

    出力:

    435239 
    

    または使用正規表現:

    print(sum(sum(map(int,r.findall(line))) for line in data)) 
    

    P robablyあなたのケースでは関係ないが、あなたはpython2を使用して、任意の中間のリストを避けたかった場合は、itertools.imapを使用することができます。

    from itertools import imap 
    print(sum(sum(imap(int,r.findall(line))) for line in data)) 
    
    +0

    時間をとっていただきありがとうございます! – Kelvinlimjk

    +0

    @Kelvinlimjk、よろしくお願いします。 –

    +0

    なぜ合計を2回しなければならないのですか?最初の合計は何ですか? (sum(sum ...)) – Kelvinlimjk

    5
    1. を助けてくださいdatare.findall\d周り
    2. 角カッコは必要ありません。

    import re 
    import urllib2 
    
    data = urllib2.urlopen("http://python-data.dr-chuck.net/regex_sum_179860.txt").read() 
    int_list = map(int, re.findall(r'\d+', data)) 
    

    >>> int_list 
    [3524, 9968, 6177, 3133, 6508, 7940, 3738, 1112, 6179, 4570, 6127, 9150, 
    9883, 418, 3538, 2992, 8527, 1150, 2049, 2834, 2630, 3840, 2638, 3800, 
    9144, 5866, 6742, 588, 6918, 7802, 8229, 7947, 8992, 1339, 2119, 846, 
    3820, 4070, 9356, 9708, 3238, 9380, 5572, 9491, 3038, 7434, 7771, 288, 
    8632, 3962, 9136, 8106, 7295, 3699, 4136, 3459, 8120, 6018, 8963, 5779, 
    3635, 3984, 4850, 9633, 2588, 7631, 9591, 1067, 7182, 1301, 8041, 1361, 
    5425, 8326, 7094, 8155, 2581, 7199, 6125, 42] 
    
    +1

    読み取りを呼び出す必要はありません。ファイルオブジェクトのように行ごとに繰り返し処理できます。 –

    +1

    @PadraicCunningham、そうです。私はそれがファイルのようなオブジェクトであることを忘れていました。コメントありがとうございました。 – falsetru

    +0

    ありがとう!申し訳ありませんが、彼は合計部分に答えるのを手伝ったので、Padriacの答えを選んだ。 – Kelvinlimjk

    1

    あなたはすべての整数を合計したい言及したので、これは、Python 3で動作します(urllib2が分割されているようurllib.requesturllib.errorという名前のPython 3でいくつかのモジュール)間:再定義データよりもデータで

    from urllib import request 
    import re 
    
    
    data = request.urlopen("http://python-data.dr-chuck.net/regex_sum_179860.txt") 
    
    result = 0 
    
    for word in data: 
        result += sum([int(x) for x in re.findall(r'\d+', str(word))]) 
    
    print(result) 
    
    関連する問題