Hilfe bei regex

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MatMat
User
Beiträge: 11
Registriert: Mittwoch 1. März 2006, 17:34

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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
MatMat
User
Beiträge: 11
Registriert: Mittwoch 1. März 2006, 17:34

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...
MatMat
User
Beiträge: 11
Registriert: Mittwoch 1. März 2006, 17:34

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:
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.
MatMat
User
Beiträge: 11
Registriert: Mittwoch 1. März 2006, 17:34

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?
synopia
User
Beiträge: 17
Registriert: Mittwoch 1. März 2006, 19:47

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...?
--
http://www.weltenwerk.net
^^
MatMat
User
Beiträge: 11
Registriert: Mittwoch 1. März 2006, 17:34

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...
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)
Antworten