[英]re.search Multiple lines Python
使用\\ 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
但我沒有任何回報。
在“建立數據:”之后,當“DEFENSE GRID”不存在時,我需要放入一個空的墊片
我知道我錯過了一些東西而且我已經嘗試閱讀re.search但我無法找到解釋多線如何工作的任何詳盡的例子。
re.findall("BUILDING DATA:\nN/A",a,re.MULTILINE)
你可以做你做的,但使用re.findall
而不是re.search
:
re.findall('BUILDING DATA:\nN/A', a, re.M)
#['BUILDING DATA:\nN/A']
編輯:
問題是你目前正在逐行閱讀。 為了檢測屬於兩行或更多行的模式,您必須將字符串視為一個整體,可能會:
s = ''.join(lines)
如果lines
不是那么大就沒關系,然后用s
來執行你的多行搜索......
我想知道你為什么沒有回來。 如果您的文件如下所示:
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
更換
re.findall('BUILDING DATA:\sN/A', a, re.M):
同
re.findall('BUILDING DATA:\nN/A', a, re.M):
要么
re.search(r'BUILDING DATA:\nN/A', a, re.M):
它應該工作。
(請注意,在您的代碼中有\\s
而不是\\n
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.