2013-08-29 6 views
9

\ sまたは '\ n'を指定してre.searchを実行すると、検索しようとしている複数行が見つかりません。ソースのre.search複数行Python

部: ":(LF)建物データ"

完全なコード

lines = open('scan.txt','r').readlines() 
for a in lines: 
    if re.search(r"\A\d", a): 
     digits = a 
     if re.search(r"2013", digits): 
      date.append(digits[:19]) 
      count +=1 
     elif re.search(r",", digits): 
      clean = digits.rstrip() 
      sector = clean.split(',') 
      x.append(sector[0]) 
      y.append(sector[1]) 
    elif re.search(r"CONTROLLED BY:", a): 
     player.append(a[15:].rstrip()) 
    elif re.search(r"ALLIANCE:", a): 
     alliance.append(a[10:].rstrip()) 
    elif re.search(r"SIZE:", a): 
     size.append(a[6:].rstrip()) 
    elif re.findall('BUILDING DATA:\sN/A', a, re.M): 
     def_grid = '' 
     print "Didn't find it" 
     defense.append(def_grid) 
     defense_count +=1 
    elif re.search(r"DEFENSE GRID", a): 
     def_grid = a[16:].rstrip() 
     print "defense found" 
     defense_count +=1 

しかし、私は何も返されたわけではないメモ帳+ +私が見るには、それを見てみると

Date/Time: 
2013-08-27 17:05:36 

----- BEGIN SEARCH ----- 

GENERAL DATA: 
NAME: AB12 
SECTOR: 
999,999 
CONTROLLED BY: Player 
ALLIANCE: Aliance 
ONLINE: 1 seconds ago 
SIZE: Large 
HOMEWORLD: NO 
APPROVAL RATING: 100% 
PRODUCTION RATE: 100% 

RESOURCE DATA: 
POWER: 0/0 
BUILDINGS: 0/20 
ORE: 80,000/80,000 
CRYSTAL: 80,000/80,000 
POPULATION: 40,000/40,000 

BUILDING DATA: 
N/A 

UNIT DATA: 
WYVERN(S): 100 

----- END SEARCH ----- 

私は「建物データ:」の後に「防衛GRID」は存在しないときには、空のスペーサーを配置する必要があり

私は何かが欠けていると私はre.search上に読んでますが試した知っ

私はマルチラインの仕組みを説明する徹底的な例は見つけられません。あなたがやった何ができる

+1

Aは、[sscce](http://sscce.org/)いいだろう。 –

+0

私はあなたが 'reをインポートするのを忘れてしまったと思うし、この例は箱の中ではうまくいきません。日付が定義されていません... –

答えて

3

、代わりにre.searchre.findallを使用して:

re.findall('BUILDING DATA:\nN/A', a, re.M) 
#['BUILDING DATA:\nN/A'] 

EDIT:

問題は、現在のライン・バイ・ラインを読んでいるということです。実行するためにsを使用し、その後linesがないので、大きい場合

s = ''.join(lines) 

okです、そして2つの以上のラインに属するパターンを検出するためには、全体として、文字列、多分やって考慮する必要があります複数行検索...

+0

私は私が取り組んでいることの詳細を追加しました。 re.findallは役に立たなかったようだ。 – Xariec

+0

@Xariecよ!あなたは多くを変えました!私は見てみる... –

+0

笑、私はそれが私の部分に単純な構文エラーになると思った...私はそれを使用しようとしている方法を説明するために残りを追加することを決めた... – Xariec

6
re.findall("BUILDING DATA:\nN/A",a,re.MULTILINE) 
1

何も返されていないのでしょうか?あなたのファイルは次のようになります場合:

BUILDING DATA: 
N/A 

私は

import re 
f = open('test.txt','r') 
a = f.read(20) 
re.search('BUILDING DATA:\nN/A', a, re.M) 

出力を使用して取得します。私は文字列でre.searchをテストする場合、これは

<_sre.SRE_Match object at 0x1004fc8b8> 

あり、それは、このコードのようにファイルにありません。期待通り

import re 
f = open('test.txt','r') 
a = f.read(20) 
re.search('BUILDING BATA:\nN/A', a, re.M) 

は、出力はありません。

EDIT:

Saulloカストロが指摘したように、問題はライン・バイ・ライン読書です。このようなものを使わないのはなぜですか?

a = open('scan.txt','r').read() 
if re.findall('BUILDING DATA:\nN/A', a, re.M): 
    print('found!') 

第三試してみてください。

tmp = False 
... 
elif re.findall('BUILDING DATA:', a, re.M): 
    tmp = True 
elif tmp and re.findall('N/A', a, re.M): 
    def_grid = '' 
    print "Didn't find it" 
    defense.append(def_grid) 
    defense_count +=1 
+0

ええ、メモ帳では、あなたが投稿したときにテキストが見えないと書いてあります。あなたは「建物データ:(LF)\ nN/A」を検索しようとしましたか?エンコーディングには問題があるようです。 –

+1

'.read()'を使うと良い点がありますが、OPのアルゴリズムが構造化されていると動作しないかもしれませんが、読んだ後では '' '.join(lines) '"よりも良い方法です。 –

+0

ええと...私はラインの一部を引き出してリストに入れる必要があるので、ラインを読んでいました。ラインの位置が必要です。また、私は(時にはその建物データ:\ nN/A、時にはDEFENSE GRIDを含む)状況を回避しようとしています。後で使うためにすべてをDBに挿入します。一貫性のあるキーを保持する必要があるので、そこにあるときだけでなく、その時間もカウントする必要があります。 – Xariec

0

re.findall('BUILDING DATA:\nN/A', a, re.M): 

または

re.findall('BUILDING DATA:\sN/A', a, re.M): 

を交換してください

と動作するはずです。

(あなたのコードに代わり\n\sがあることに注意してください)

関連する問題