regexp? oderr string?

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
pluto

Samstag 4. Januar 2003, 02:29

hallo,
wie krieg ich den folgendes am besten hin:
Ich hab einen einzigen elend langen string mit \n und allem (ein textbuffer), und daraus will ich jetzt eine liste mit allen substrings die einem bestimmten pattern entsprechen - pattern etwa "the quick brown .*? the lazy dog"

Hab's mit re.split() probiert aber dann hab ich ja in der liste auch den ganzen muell der zwischen den matches steht...
Ist bestimmt ganz einfach aber nicht mal das tutorial fuer regexps hat mir da gross weitergeholfen
pluto

Samstag 4. Januar 2003, 02:48

dazu gleich noch ne frage: na klar koennen in meinem textbuffer-string auch zeichen auftauchen die in einer regexp eine bedeutung haetten, also z.B. ein pattern wie
"also gut... gut? hm." + .*? + "von [montag, 3.5.] - ?"

Wie kann ich das dann so zu einer regexp compilen das alles ausser dem .*? genauso matcht wie es ist???
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

Samstag 4. Januar 2003, 15:28

pluto hat geschrieben:hallo,
wie krieg ich den folgendes am besten hin:
Ich hab einen einzigen elend langen string mit \n und allem (ein textbuffer), und daraus will ich jetzt eine liste mit allen substrings die einem bestimmten pattern entsprechen - pattern etwa "the quick brown .*? the lazy dog"
Zum Beispiel so:

Code: Alles auswählen

import re

test = """Zehn plus zehn ist Zwanzig.
Drei mal drei ist Neun.
Zehn mal zehn ist Hundert.
Fünf plus fünf ist Zehn.
Zehn minus zehn ist garnix."""

reZehn = re.compile("Zehn .* zehn")
ergebnis = []
m = reZehn.search(test)
while m:
    ergebnis.append(m.group())
    m = reZehn.search(test, m.end())

print ergebnis
Du gehst die Matches einzeln durch, und suchst jemeils am Ende eines Match weiter.

Jörg
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

Samstag 4. Januar 2003, 15:31

pluto hat geschrieben: Wie kann ich das dann so zu einer regexp compilen das alles ausser dem .*? genauso matcht wie es ist???
Du must Die Zeichen im String mit einem Backslash maskieren, z.B. so:

re.compile("Was ist los\?")

Jörg
pluto

Samstag 4. Januar 2003, 16:39

Danke joerg; ich habs noch ein bisschen anders, ohne while und einfach re.findall statt re.search - ich frag mich bloss warum ich das gestern nicht schon gefunden hab, steht doch in der doc... Oder spricht irgendwie was gegen findall?

Code: Alles auswählen

import re

test = """zehn plus zehn ist zwanzig.
drei mal drei ist neun.
zehn mal zehn ist hundert.
fuenf plus fuenf ist zehn.
zehn minus zehn ist garnix.
"""
patstart = "zehn"
patend = "zehn"

rezehn = re.compile(patstart+".*?"+patend, re.DOTALL)
m = rezehn.findall(test)
print m
Und aus dem pattern .*? gemacht / re.DOTEND weil das ja auch ueber mehrere lines matchen soll wenn's denn muss.
das findall findet ja laut dem doc alle 'non-overlapping matches' - wie waers denn wenn ich auch overlapping matches wollte: in deinem beispiel find ich so jetzt

Code: Alles auswählen

['zehn plus zehn', 'zehn mal zehn', 'zehn.\nzehn']
aber wie komm ich an

Code: Alles auswählen

['zehn plus zehn', 'zehn mal zehn', 'zehn.\nzehn', 'zehn minus zehn']?
fragen ueber fragen... die andere sache hab ich jez noch nicht probiert aber das scheint ja recht umstaendlich zu werden, wenn man jedes sonderzeichen extra escapen muss - gibts keine moeglichkeit eine regexp etwa so zu machen:

"<tuedeldue>.*?<palimpalim>" , wobei alles was in <> steht einfach 1:1 matchen soll ohne das das weiter compiled wird? oder so?

sorry, bin halt anfaenger, aber es wird langsam... :)
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

Samstag 4. Januar 2003, 18:37

Gegen findall() spricht aus meiner Sicht nichts... ;-)

Zum überlappenden Suchen fällt mir erstmal nichts weiter ein, als doch wieder meine Methode mit dem while zu nehmen, und die Zeile
m = reZehn.search(test, m.end())
durch
m = reZehn.search(test, m.start()+1)
zu ersetzen.
Aber dann findet er auch mehr, als er wohl eigentlich sollte... ;-)
Geht bestimmt auch noch einfacher...

Zum Thema Maskieren von Sonderzeichen kannste Dir mal re.escape() anschauen.

Viel Glück
Jörg
pluto

Sonntag 5. Januar 2003, 02:09

Jau danke,
re.escape scheint doch genau richtig! :)
vielen dank!
Antworten