2013-08-29 18 views
9

re.search z \ s lub '\ n' nie znajduje multiliny, którą próbuję wyszukać.re.search Wiele linii Python

Porcja Źródło:

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

Patrząc na to w Notepad ++ widzę "Dane budynku: (LF)"

pełny kod

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 

Ale ja nie mam nic wrócił .

muszę umieścić w pustej spacer po „obrona GRID” nie istnieje po „Dane budynku:”

wiem, że czegoś brakuje i Próbowałem czytania na re.search ale Nie jestem w stanie znaleźć żadnych dokładnych przykładów wyjaśniających działanie multilinii.

+1

A [sscce] (http://sscce.org/) byłoby miło. Trudno zrozumieć, o co dokładnie chodzi. –

+0

Myślę, że zapomniałeś "zaimportować ponownie" i ten przykład nie działa po wyjęciu z pudełka. Data nie jest zdefiniowana ... –

Odpowiedz

3

Można zrobić tylko to, co zrobiłeś, ale przy użyciu re.findall zamiast re.search:

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

EDIT:

Problemem jest to, że obecnie czyta wiersz po linijce. W celu wykrycia wzór, który należy do dwóch lub więcej linii, trzeba wziąć pod uwagę ciąg jako całość, może robi:

s = ''.join(lines) 

który jest ok, jeśli lines nie jest tak duża, a następnie użyj s wykonać Twoje wieloliniowe wyszukiwania ...

+0

Dodałem więcej tego, nad czym pracowałem. Re.findall nie pomagał. – Xariec

+0

@Xariec wow! bardzo się zmieniłeś! Będę miał ... –

+0

lol, myślałem, że to będzie tylko prosty błąd składniowy z mojej strony ... Postanowiłem dodać resztę, aby wyjaśnić, jak próbuję go użyć ... – Xariec

1

Zastanawiam się, dlaczego nic nie wróciłeś. Jeśli plik wygląda tak:

BUILDING DATA: 
N/A 

uzyskać stosując

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

wyjście. To

<_sre.SRE_Match object at 0x1004fc8b8> 

Gdybym przetestować re.search sznurkiem, który nie znajduje się w pliku jak w tym kodzie:

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

nie ma wyjścia, jak oczekiwano.

EDIT:

Jak Saullo Castro podkreślił, problemem jest czytanie wiersz po wierszu. Dlaczego nie skorzystać z czegoś takiego?

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

3-ty try:

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

Tak, napisałeś, że w Notatniku tekst nie wygląda tak, jak napisałeś. Czy próbowałeś wyszukać "BUDOWANIE DANYCH: (LF) \ nN/A"? Wydaje mi się, że jest jakiś problem z powodu kodowania. –

+1

+1 dobry punkt za pomocą '.read()', ale sposób w jaki zbudowany jest algorytm OP może nie działać, ale jest to z pewnością lepsze podejście niż ''' .join (linie)' po przeczytaniu ich ... –

+0

Hmm .... Czytałem linię, ponieważ muszę wyciągnąć części linii i umieścić je na liście i potrzebuję lokalizacji linii. Zajmuję się również sytuacją, w której (czasami jego DANE BUDOWLANE: \ nN/A, a czasem obejmuje GRANĘ OBRONY) Wstawianie wszystkiego do bazy danych do późniejszego wykorzystania. Konieczność zachowania spójności klawiszy, więc muszę liczyć, ile razy jej nie ma, a także kiedy jest. – Xariec

0

Wymień

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

z

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

lub

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

i powinno działać.

(Zauważ, że w kodzie nie ma \s zamiast \n)