14

\s または '\n' を使用した re.search では、検索しようとしている複数行が見つかりません。

ソースの一部:

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 -----

Notepad ++で見ると、「BUILDING DATA:(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

しかし、私は何も返されていません。

「BUILDING DATA:」の後に「DEFENSE GRID」が存在しない場合は、空のスペーサーを入れる必要があります。

私は何かが欠けていることを知っており、re.search を読んでみましたが、複数行がどのように機能するかを説明する完全な例を見つけることができません。

4

4 に答える 4

12
re.findall("BUILDING DATA:\nN/A",a,re.MULTILINE)
于 2013-08-29T21:57:54.437 に答える
5

あなたがしたことと同じことをすることができますが、re.findall代わりに次のものを使用しますre.search:

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

編集:

問題は、現在行ごとに読んでいることです。2 行以上に属するパターンを検出するには、文字列全体を考慮する必要があります。おそらく次のようにします。

s = ''.join(lines)

linesそれほど大きくない場合は問題ありません。次にs、複数行の検索を実行するために使用します...

于 2013-08-29T21:41:25.957 に答える
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)

出力。これは

<_sre.SRE_Match object at 0x1004fc8b8>

文字列で re.search をテストすると、次のコードのようにファイルにはありません。

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

期待どおりの出力はありません。

編集:

Saullo Castro が指摘したように、問題は行ごとの読み取りです。このようなものを使用しないのはなぜですか?

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

3回目の試行:

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
于 2013-08-29T22:02:54.097 に答える