2017-05-10 6 views
0

Ich arbeite im Hotel. hier ist RAW-Datei von Rapporten Hier ein Beispiel, das sich jedoch nur 2 Zimmer ich brauche have.I Daten zu extrahieren, um so etwas wie data['roomNumber']=('paxNumber',isbb,)Regex extrahieren Daten aus Rohtext

zu haben, die 10 und 12, so dass die Daten i sollte BreakfastData = {'10':['2','BB'],'12':['1','BB']}

sein müssen

1) roomNumber: 'beginnt und endet mit Nummer' oder 'beginnt mit Nummer und strikt einem oder mehreren Leerzeichen gefolgt von' 2) paxNumber sind die zwei Zahlen kurz vor dem 'VA' String
3) isbb wird definiert durch das Vorkommen "BB" oder "HPDJ", das zwischen zwei "/" zu finden ist. Aber manchmal ist das Format nicht gut, so kann es sein, '/ HPDJ /' oder '/ HPDJ /' oder '/ HPDJ /' etc

10 PxxxxD, David, Frau, Herr T- EXPEDIA TRAVEL

08.05.17 12.05.17 TP

SUP DBL/HPDJ/DEBIT CB AGENCE - NR

2 0 VA

NR

LxxxxSH, Claudia, Mrs

08.05.17 19.05.17 TP

1 0 VA

NR BB

SUP SGL/BB/en attente DE VIREMENT- EVITER LA 66 -

.... etc

edit: neueste

import re 
data = {} 
pax='' 
r = re.compile(r"(\d+)\W*(\d+)\W*VA") 
r2 = re.compile(r"/\s*(BB|HPDJ)\s*/") 
r3 = re.compile(r"\d+\n") 
r4 = re.compile(r"\d+\s+\w") 
PATH = "/home/ryms/regextest" 

with open(PATH, 'rb') as raw: 
    text=raw.read() 
#roomNumber = re.search(r4, text).group() 
#roomNumber2 = re.search(r3, text).group() 
roomNumber = re.search(r4, text).group().split()[0] 
roomNumber2 = re.search(r3, text).group().split()[0] 

pax = re.findall(r, text) 
adult = pax[0]; enfant = pax[1] 
# if enfant is '0': 
# pax=adult 
# else: 
# pax=(str(adult)+'+'+str(enfant)) 
bb = re.findall(r2, text)  #On recherche BB ou HPDJ 
data[roomNumber]=pax,bb 

print(data) 
print(roomNumber) 
print(roomNumber2) 

Rückkehr

{'10': ([('2', '2'), ('1', '1')], ['HPDJ', 'BB'])} 
10 
12 
[Finished in 0.1s] 

Wie kann ich die beiden Zimmernummer in meiner Rückkehr? Ich habe viel Probleme mit dem \ n Problem und lesen(), readline(), readlines(). Was ist der Trick?

Wenn ich alle Rohdaten habe, wie bekomme ich die richtigen BreakfastData {}? Werde ich .zip() benutzen? Bei der Bigining wollte ich die Datei teilen und dann analysieren, aber ich versuche es vielleicht Dinge, ich bin verloren. Und dazu brauche ich eine Regex, die zu beiden Mustern passt.

Antwort

1

Auf den ersten Fall, dass Sie zwei Nummern wählen, die von ‚VA‘ gefolgt sind, können Sie tun, wie diese

r = re.compile(r"(\d+)\W*(\d+)\W*VA") 

Im zweiten Fall, dass Sie HPDJ oder BB wie diese

r = re.compile(r"/\s*(HPDJ|BB)\s*/") 

bekommen Dies wird alle Fälle behandeln, die Sie erwähnten >>/HPDJ/'oder'/HPDJ/'oder'/HPDJ/'

+0

diese beiden Ausdrücke werden in Ihrem Fall übereinstimmen 1)^\ d + $ #dies wird Match 'Start und endet mit Nummer' 2)^\ d + \ s + \ w + $ # das wird 'Start mit Nummer und streng ein oder mehrere Leerzeichen gefolgt von String' – somil

+0

kann ich einen Regex mit den beiden machen? Ich sehe keine Verwendung von re.findall mit mehreren Mustern? .. Und wie kann ich nur die Zahlen nicht die \ n oder die 'P' bekommen – rasdehya

+0

Stellen Sie nicht diese vielen Fragen in den Kommentaren. Stellen Sie neue Fragen für neue Zweifel und akzeptieren Sie die aktuelle Antwort, wenn sie Ihr Problem löst. – somil

0

Der reguläre Ausdruck, den Text zu erhalten, bevor die VA ist wie folgt:

r = re.compile(r"(.*) VA") 

Dann wird die „Nummer“ (was ein String sein wird) wird in dem ersten group des Such Match-Objekts gespeichert werden, Sobald Sie die Suche ausführen.

Ich bin nicht ganz sicher, was die Zimmernummer überhaupt ist, weil Ihre Beschreibung ein wenig unklar ist, so kann ich nicht damit helfen, es sei denn, Sie klären.