Seite 1 von 1

Hilfe bei regex

Verfasst: Mittwoch 1. März 2006, 17:43
von MatMat
Hallo ich möchte folgendes tun:

Ich habe z.B folgende Zeilen:

Code: Alles auswählen

zeile 1
zeile 2

zeile 4

container
a
b c 
d
endcontainer

zeile 12

container
z i
endcontainer
Jetzt will ich exakt die Position der container und endcontainer zeilen bekommen.
Also in dem fall sollte meine regex was liefern
wie: (6,10) und (14,16)

Leider schaffe ich es einfach nicht die regex zu bauen.....

Danke für eure Hilfe.
Mein erster Ansatz war:

Code: Alles auswählen

s = re.compile('(?:container) | (?:endcointainer)', re.IGNORECASE)
pf = s.findall(file_text)
Danke euch

Verfasst: Mittwoch 1. März 2006, 18:00
von CM
Warum regexes? Du hast doch nicht einen String, sondern viele Zeilen, ggf. in einer Datei. Dann kannst Du Dir besser merken an welchen Positionen Du Deinen Flags begegnests. Oder verstehe ich das falsch?

Gruß,
Christian

Verfasst: Mittwoch 1. März 2006, 18:07
von MatMat
danke für die Antwort,
aber ich muss das file bearbeiten bzw. mein im speicher liegendens file.
Ich möchte die zeilen zwischen den container endcontainer zeilen extrahieren.
Ich wollte so vorgehen eben mir die positionen merken...
und dann einfach mein aufgebautes dictionary aus zeilen mit dict[?] = dict[?](:pos1) + dict[?](pos2:)
extrahieren.

Mein pos1 und pos2 wären dann die matches der regex...?

So wollte ich das machen...

Verfasst: Mittwoch 1. März 2006, 19:24
von MatMat
Ok vielleicht ist es etwas umständlich ausgedrückt:
Also ich habe ein file komplett mit read() eingelesen,
habe also einen string:

Code: Alles auswählen

"zeile1\nzeile2\ncontainer\na\nbcd e\nendcontainer"
Jetzt möchte ich eine liste von tupeln haben die mir die indices des wortes container udn endcontainer herausgeben.
Also in diesem fall: [(14,32)]

Damit kann ich mir genau den bereich extrahieren der zwischen container und endcontainer steht....

Nur schaffe ich es keineswegs eine sinnvolle regex zu bauen....

EDIT:
wie ich die tupel erstellen kann weiß ich bereits: finditer() etc...
jetzt bräuchte ich nur noch die regex die mir den kompletten bereich section...endsection matcht....

nur dass habe ich immer noch nicht :oops:

Verfasst: Mittwoch 1. März 2006, 22:12
von BlackJack
Wie wär's damit:

Code: Alles auswählen

In [47]:a = "zeile1\nzeile2\ncontainer\na\nbcd e\nendcontainer"

In [48]:b = re.compile(r'container(.*?)endcontainer', re.DOTALL)

In [49]:list(b.finditer(a))[0].span()
Out[49]:(14, 44)
Der zweite Index stimmt nicht ganz mit Deiner Erwartung überein. Das liegt daran, das 'container' und 'endcontainer' mit in dem Treffer enthalten sind.

Verfasst: Donnerstag 2. März 2006, 10:11
von MatMat
Klasse, so funktionierts für ein Auftreten.
Für mehrere container...endcontainer vorkommen funktionierts noch nicht ganz....
wenn ich aber alles der regex in ()* setze hängt sich bei mir alles auf...
wie kann ich jetzt noch mehrfahrvorkommen bekommen?

Verfasst: Donnerstag 2. März 2006, 15:56
von synopia

Code: Alles auswählen

a = "zeile1\nzeile2\ncontainer\na\nbcd e\nendcontainer\nzeile1\nzeile2\ncontainer\na\nbcd e\nendcontainer" 
b = re.compile(r'container(.*?)endcontainer', re.DOTALL) 
for x in b.finditer(a):
    print x.span()
klappt doch... o.O...?

Verfasst: Freitag 3. März 2006, 10:11
von MatMat
danke ja so klappt es ....

jetzt habe ich ein weiteres problem:

wenn ihc einen string habe:
st = "hier ist\ncontainer irgendwas\nund hier das was ich will\nendcontainer"
wie kann ich exakt auf das "und" nach dem container matchen?

mit folgender regex gehts nicht:

Code: Alles auswählen

re.compile(r'(?<=section(?!(\s*=))(\s*)(\W*)\\n)(.*?)(?=endcontainer)', re.DOTALL | re.IGNORECASE)
nur geht das nicht wegen fixed with look ahead assertion...

Verfasst: Freitag 3. März 2006, 23:47
von BlackJack

Code: Alles auswählen

import re

source = """\
hier ist
container irgendwas
und hier das was ich will
endcontainer
"""

container_re = re.compile(r'container(?:.*?)\n(.*?)endcontainer', re.DOTALL)
print container_re.findall(source)