2016-08-13 17 views
0

私は、このファイルの最初の大文字の単語を解析していますスクリプトを持っている:IndexErrorまでの解析が成功しましたか?

IMPORT fs 

IF fs.exists("fs.pyra") THEN 
    PRINT "fs.pyra Exists!" 
END 

スクリプトは次のようになります。

file = open(sys.argv[1], "r") 
file = file.read().split("\n") 

while '' in file: 
    findIt = file.index('') 
    file.pop(findIt) 

for line in file: 
    func = "" 
    index = 0 
    while line[index] == " ": 
     index = index + 1 
    while not line[index] == " " or "=" and line[index].isupper(): 
     func = func + line[index] 
     index = index + 1 
    print func 

すべて使用されるモジュールがすでにインポートされています。
私は、引数内の解析されたパスされていたファイルを渡され、私はこの出力を取得しています:

IMPORT 
IF 
PRINT 
Traceback (most recent call last): 
    File "src/source.py", line 20, in <module> 
    while not line[index] == " " or "=" and line[index].isupper(): 
IndexError: string index out of range 

それは、リスト内の最後の引数まで首尾よく解析していますし、それがすべてでそれを解析していないを意味し、どの。これをどうやって解決するのですか?

+0

'[インデックス] ==「」または「=」'を行ないが、それは例えば、各ラインから大文字で見つかったトークン非常に最初の名前を取りますあなたが思っていることをやっていない - 代わりに '( '=')'を意味するのだろうか? –

+0

'file.read()。split(" \ n ")' ...?なぜ、 'file.readlines()'はありませんか? –

+0

@ cricket_007 'file.readlines()'は改行文字をその中に残します。 – baranskistad

答えて

0

スペースのインデックスを増やす必要はありません。line.strip()は、先頭と末尾のスペースを削除します。

split()単語を取得するためのスペース上の行。

その後、あなたはこれらの文字列を反復し、また、単語全体ではなく、個々の文字


をチェックするためにisupper()を使用し、[A-Z]+

とにかく

ためのパターンマッチングによって、ファイル全体を実行することができます、あなたのエラー...

while not line[index] == " " or "=" 

or "="は常にTrueであるため、インデックスが境界外に出る

0

処理しようとしているファイルがPythonに組み込まれたトークナイザと互換性がある場合は、それを使用して、

import sys 
from itertools import groupby 
from tokenize import generate_tokens, NAME 

with open(sys.argv[1]) as fin: 
    # Tokenize and group by each line 
    grouped = groupby(tokenize.generate_tokens(fin.readline), lambda L: L[4]) 
    # Go over the lines 
    for k, g in grouped: 
     try: 
      # Get the first capitalised name 
      print next(t[1] for t in g if t[0] == NAME and t[1].isupper()) 
     except StopIteration: 
      # Couldn't find one - so no panic - move on 
      pass 

これがあなたに与えます:

IMPORT 
IF 
PRINT 
END 
関連する問題