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
regexp? oderr string?
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???
"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???
Zum Beispiel so: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"
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
Jörg
Du must Die Zeichen im String mit einem Backslash maskieren, z.B. so:pluto hat geschrieben: Wie kann ich das dann so zu einer regexp compilen das alles ausser dem .*? genauso matcht wie es ist???
re.compile("Was ist los\?")
Jörg
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?
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
aber wie komm ich an
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...
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
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']
Code: Alles auswählen
['zehn plus zehn', 'zehn mal zehn', 'zehn.\nzehn', 'zehn minus zehn']?
"<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...
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
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