2016-03-27 8 views
-1

だから私はこのプログラムとそのファイル "englishsorted.txt"を読んで、 「A」または「a」が生じる。私はパターンオブジェクトを使用するはずです。私は本当に何が欠けているのか、間違っているのかは分かりません。私は助けに感謝します。Aかaで始まる単語がファイルから出てくる時間を数えてください

import sys 
import re 

count = 0 
x = open("englishsorted.txt", "r") 

while 1: 
    pattern = x.readline() 
    if pattern == re.compile(r'^[A,a].'): #regex that finds words starting with an A or a 
    count = count + 1 

x.close() 

print count 
+1

エラーは何ですか? – MarkyPython

答えて

0

さて、エラーから始めましょう。

  • ファイルの最後に壊れない無限ループを作成しました。

  • あなたは混乱してpatternと呼ばれていたテキスト行とパターンを比較します。これらの2つは非常に異なるものです。一方はタイプstrであり、他方は_sre.SRE_Patternである。 'abc' == re.compile(r'^[A,a].')を試してみてください。あなたはto use the pattern in a search/match insteadと思われます。

また、各行の先頭にパターン検索を行うこともできますが、一度に1行ずつ読むこともできます。

pattern = re.compile(r'^[A,a].*', re.MULTILINE) 

re.MULTILINEが存在する場合、ファイルの先頭にあるパターンのため、すべての新しい行の先頭にあるシンボル^検索。 .*は、残りの行と完全に一致します。ドットは1文字のワイルドカード記号であり、星はその行にある数だけ一致します。私はこれらの2つの文字を追加して、行全体を抽出します。線が何を言っているのか、あなたのパターンにどれだけ一致しているのか気にしなければ、それらを落とすことができます。全体的に、これはうまくいくはずです。

import re 

with open('englishsorted.txt') as f: 
    data = f.read() 

pattern = re.compile(r'^[A,a].*', re.MULTILINE) 
matches = re.findall(pattern, data) 

print len(matches) 
0

最初にあなたはcount = count + 1と一致する必要があります。 これを行うには良い方法があります:

count += 1 

あなたのプログラムがを停止したことがないだけでので、今、あなたはすべての出力を見ることはできません。これはwhile 1:によって引き起こされます。あなたはサイクルを止める状態を決して置かない。それはここのように、breakを使用停止するには

while 1: 
    pattern = x.readline() 

    if pattern == "": 
     break 

    if pattern == re.compile(r'^[A,a].'): 
     count += 1 

ファイルの読み取り/書き込みの詳細については、docsを読んだり、以下を参照してください。

次に、あなたの正規表現は動作しません...私は別のアプローチをしました:

if pattern[0] == "A" or pattern[0] == "a": 
    count += 1 
:言葉は、「A」または「」とき、その最初の文字はそう、これらの一つであるで始まります

私はあなたがそうであるように行毎にファイルを読み込むことは少しトリッキーだと思い、私はそれにこの方法をお勧めします:ここで

x = open("englishsorted.txt", "r") 
count = 0 

for line in x: 
    # do something with line, in your case: 
    if line[0] == "A" or line[0] == "a": 
     count += 1 

EDIT

rのソリューションをegex:

import re 

x = open("englishsorted.txt", "r") 
count = 0 

for line in x: 
    if re.match("^[aA]", line): 
     count += 1 

^は、文字列の先頭にマッチし、[aA]docsによると、文字のセットを示しています。

+0

インデントは意図せぬミスですが、プログラムのために正規表現パターンオブジェクトを使用する必要がありますので、正規表現が必要です –

+0

@AkashPatel編集を見てください... – xdola

0

コードに無限ループがあります。ループ:

while 1: 
    pattern = x.readline() 
    ... 

が最後です。

次のようにあなたは、単にあなたのスクリプトを書くことができ:

import sys 

count = 0 
x = open("englishsorted.txt", "r") 
exit = False 

while not exit: 
    pattern = x.readline() 
    if not pattern: 
     exit=True  
    elif pattern.startswith("A") or pattern.startswith("a"): 
     count = count + 1  

x.close() 

print count 

終了変数は、 whileループを終了するためのスクリプトを支援します。