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
Suchen Ersetzen mit RegularExpressions (Gruppierungen)
- 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
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...
kaepten
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...
kaepten
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
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
Hallo Christian
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
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: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.
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
Was Du machen kannst ist Folgendes (denke das meintest Du mit dieser group-Geschichte):
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?
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
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
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
Das r' macht das z.B. \n nicht als newline-character gilt, sondern als '\n'.
Gruß,
Christian
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.
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.
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
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