10

ドキュメントから抜粋した以下は、正規表現メソッド findall がどのように機能するかを示すスニペットであり、リストが返されることを確認しています。

re.findall(r"\w+ly", text)
['carefully', 'quickly']

IndexError: list index out of rangeただし、次のコード フラグメントでは、findall によって返されるリストの 0 番目の要素にアクセスしようとすると、範囲外エラー ( ) が生成されます。

関連するコード フラグメント:

population = re.findall(",([0-9]*),",line)
x = population[0]
thelist.append([city,x])

なぜこれが起こるのですか?

いくつかの背景として、そのフラグメントがスクリプト全体にどのように適合するかを次に示します。

import re

thelist = list()
with open('Raw.txt','r') as f:
    for line in f:
        if line[1].isdigit():
            city = re.findall("\"(.*?)\s*\(",line)
            population = re.findall(",([0-9]*),",line)
            x = population[0]
            thelist.append([city,x])

with open('Sorted.txt','w') as g:
    for item in thelist:
        string = item[0], ', '.join(map(str, item[1:]))
        print string

編集:これが起こった理由の背景については、以下のコメントを読んでください。私の簡単な修正は次のとおりです。

if population: 
        x = population[0]
        thelist.append([city,x])
4

3 に答える 3

12

re.findall一致するものがない場合、空のリストを返します。

>>> re.findall(r'\w+ly', 'this does not work')
[]
于 2013-02-21T00:55:24.330 に答える
3

re.findall一致するものがなかった場合、空のリストを返すことができます。アクセスしようとすると、[][0]それが表示されIndexErrorます。

一致しないことを考慮するには、次のようなものを使用する必要があります。

match = re.findall(...)
if match:
  # potato potato
于 2013-02-21T00:58:34.467 に答える