re.search with \s或'\n'找不到我要搜索的多行。
来源部分:
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 -----
在记事本++中查看它,我看到"建筑数据:(LF)"
全代码
lines = open('scan.txt','r').readlines()
for a in lines:
if re.search(r"Ad", 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
但我什么都没还。
当"建筑数据:"之后不存在"防御网格"时,我需要放一个空的间隔符
我知道我遗漏了一些东西,我试着在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!')
第三次尝试:
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
)