2013-02-21 6 views
7

ドキュメントから、以下は、regexメソッドfindallがどのように動作するかを示すスニペットであり、リストが返されることを確認します。 findAllによって返されたリストの0番目の要素にアクセスしようとすると、次のコード断片は、境界誤差(IndexError: list index out of range)のアウトを生成しかしPython:Regex findallがリストを返しますが、なぜリスト要素[0]にアクセスしようとするとエラーが返されますか?

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

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

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 

EDIT:これが起こった理由について、いくつかの背景については、以下のコメントを読むことフラグメントは私のスクリプト全体にどのように適合するか、いくつかのより多くの背景については

は、ここにあります。私の簡単な修正されました:一致がない場合

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

正規表現が常に一致するとPythonシェル上で独立してそのフラグメントを実行して、時には – JBernardo

+0

を空のリストを返しませんの

if match: 

はそれがないことを示しています。同じ入力ファイルも使用されます。 – Louis93

+1

は明らかに* all *行ではありません。 –

答えて

11

re.findallは空のリストを返します。

>>> re.findall(r'\w+ly', 'this does not work') 
[] 
3

re.findallはあなたにマッチがなかった場合は空のリストを返すことができます。 [][0]にアクセスしようとすると、IndexErrorが表示されます。私はこれと同じ問題があった

match = re.findall(...) 
if match: 
    # potato potato 
1

は、アカウントに何の一致を取らないために、あなたはの線に沿って何かを使用する必要があります。解決策は非常に単純なように思えます、なぜ私はそれを考慮していないのか分かりません。代わりに

if match[0]: 
関連する問題