Suchen Ersetzen mit RegularExpressions (Gruppierungen)

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
kaepten
User
Beiträge: 3
Registriert: Montag 14. Februar 2005, 08:09

Hallo python Freunde

Ich bin ganz neu in python und sollte eine bestehende RegEx etwas umschreiben. Leider bin ich bis jetzt erfolglos geblieben.

Die bestehende funktionierende Regex:
pattern = r'(src="/([a-zA-Z0-9]*/)*)'
result = re.sub( pattern, "src=\"/MyPath/", content)

Das neue Muster soll so auschauen:
pattern = r'(img.*?src="/([a-zA-Z0-9]*/)*)'

Beispiele:
img alt="test" src="/root/pic.gif"
img src="/root/pic.gif"
img width="16" src="/root/pic.gif"

Ich schaffs nicht das Ersetzen umzuschreiben, dass korrekt ersetzt wird. Gefunden wird, aber wie muss ich das ersetzen machen? Die Ersetzung soll ja nicht bloss immer scr="... einfügen, sondern auch das was ich mit .*? maskiere! Kann ich irgendwie Gruppen einsetzen?

pattern = r'(img(.*?)src="/([a-zA-Z0-9]*/)*)'
result = re.sub( pattern, "img(hier der Inhalt von .*?)src=\"/MyPath/", content)

Vielen Dank für Hinweise und Tipps!
kaepten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Anscheinend willst du eine HTML-Seite "auswerten", das würde ich nicht unbedingt mit RE machen, sondern mit einem richtigen Parser! Such mal in Forum nach "SGMLParser" oder "HTMLParser" oder http://python.sandtner.org/viewtopic.php?t=582
kaepten
User
Beiträge: 3
Registriert: Montag 14. Februar 2005, 08:09

Hallo

Vielen Dank für die Antwort.

Es ist schon richtig, dass es sich um HTML-Tags handelt die ich parsen muss. Allerdings ist das Script bestandteil eines CMS und ich habe nicht direkten Zugriff auf die ganze HTML-Seite. Ich bekomme den HMTL-Code innerhalb einer Variable content

Wie gesagt, ich bin noch unerfahren mit python, deshalb weiss ich nicht genau welche Möglichkeiten ich habe. Einfachheitshalber möchte ich aber mal einfach den bestehenden Code des python-script überarbeitet übernehmen.

Kannst Du mir denn konkret in Bezug auf das re.sub mit Gruppierung etwas sagen. Muss ich das irgendwie anders - über match und loopen - lösen. Denn nach match habe ich ja eine sog. group Liste.

Das Beispiel in Deinem Link werde ich mal studieren, vielleicht kann ich da meine Lösung daraus ableiten... :roll:

kaepten
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hi,

Wenn es wirklich nur um das Ersetzen geht, kann man schon mit einem Mini-Eigenbau-Parser arbeiten. Ansonsten hat Jens recht: Die eigene Zeit ist viel zu schade immer wieder Parser neu zu schreiben - die meisten gibt es schon.

Was Du brauchst ist ein HowTo-Dokument zum Thema "Reguläre Ausdrücke". Man braucht ein wenig Zeit und Geduld um es zu lernen, aber es lohnt sich. Die Lösung zu Deiner Frage steht im Dokument - allerdings mußt Du erst ein wenig lesen.

Gruß,
Christian
kaepten
User
Beiträge: 3
Registriert: Montag 14. Februar 2005, 08:09

Hallo Christian
CM hat geschrieben: Was Du brauchst ist ein HowTo-Dokument zum Thema "Reguläre Ausdrücke". Man braucht ein wenig Zeit und Geduld um es zu lernen, aber es lohnt sich. Die Lösung zu Deiner Frage steht im Dokument - allerdings mußt Du erst ein wenig lesen.
Das kenne ich und ich wollte anhand dieses Turtorials meine RegEx anpassen, war aber etwas überfordert fürs Erste. Vielleicht muss ich meine Frage ganz konkret stellen:

Kann ich mit dem Befehl re.sub wirklich keine "Group" Funktionalität nutzen? Ich konnte die Groupierungs-Funktionalität nur im Zusammenhang mit match finden.

Ich mach mich nochmals daran, die Beispiele hier im Forum zu verstehen. Vielleicht verstehe ich dann das Konzept der python RegEx's dann endlich besser. Was ich auch nicht finden konnte: Was bedeutet das r in dieser Zeile: pattern = r'(src="/([a-zA-Z0-9]*/)*)' ?

Vielen Dank für die Antwort
kaepten
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Was Du machen kannst ist Folgendes (denke das meintest Du mit dieser group-Geschichte):

Code: Alles auswählen

 #pattern ist ein compiliertes re-Objekt
iterator = re.finditer(pattern,'einString')
for match in iterator:
    pass
#oder etwas wie:
for x in ein_re_object.findall('einString'): pass
Aber wozu brauchst Du das? Ich denke, Du möchtest bloß Ersetzungen durchführen?

Ich verstehe Dein Beispiel nur ungefähr, aber das ist ungefähr was Du willst, oder?

Code: Alles auswählen

import re

to_replace = """img alt="test" src="pic.gif" 
img src="pic.gif" 
img width="16" src="pic.gif" 
"""
directory = 'root'
def dic_replace(match):
	m = match.group()[5:]
	return 'src="/root/%s"' % m
pattern = re.compile('src=".*"') 
#das pattern muss natuerlich etwas mehr koennen
result = pattern.sub(dic_replace,to_replace)
print result
Wenn es nicht ist, was Du willst, mußt Du die Frage nochmal für Doofe stellen - also für Leute wie mich. :!:

Das r' macht das z.B. \n nicht als newline-character gilt, sondern als '\n'.

Gruß,
Christian
BlackJack

Hi kaepten,

Du möchtest doch nochmal das hier lesen:
http://www.amk.ca/python/howto/regex/regex.html

Und zwar den Abschnitt `5.2 Search and Replace`. Da steht was Du suchst. Sogar wie man den Gruppen Namen geben kann damit das ganze schön lesbar wird.
Gast

Hallo @alle

Vielen Dank für die Hilfen!

Es hat nun geklappt, das Tutorial hat geholfenim Zusammenhang mir der Gewissheit Eurer Antworten dass es gehen muss. Mein Problem - als Neuling - war, dass das Abgreifen des "group"-Strings über \1 etc. nicht funktionierte. Die Lösung war natürlich die Verwendung von r

kaepten
Antworten