Regular Expressions

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
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

Hallo!

Könnte mir jemand bei folgendem "Problem" helfen:

Ich habe folgende Links aus einer Homepage extrahiert (kleiner Auszug):

<img src="image/flag/France.png"/>,
<img src="image/flag/Canada.png"/>,
<img src="image/flag/Germany.png"/>,
<img src="image/flag/Spain.png"/>,
<img src="image/flag/Canada.png"/>,
<img src="image/flag/Italy.png"/>,


ich möchte mir nun mit Hilfe eines RegEX nur die Namen der Länder aus diesen Links ausgeben lassen.
Da ich im Umgang mit RegEx nicht so geübt bin: Könnte mir vielleicht jemand den Ausdruck nennen?


Vielen Dank!!
BlackJack

@Padidem: HTML sollte man nicht mit regulären Ausdrücken verarbeiten. Womit auch immer Du an die `img`-Elemente gekommen bist solltest Du auch noch das `src`-Attribut extrahieren. Und dann braucht man auch keinen regulären Ausdruck mehr sondern kann den Dateinamen mit der `split()`- oder `partition()`-Methode trennen und dann das selbe mit der Dateinamenserweiterung machen. Oder man prüft auf '.png' und benutzt die Slicing-Syntax.
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

Das kann schon sein...aber die Aufgabenstellung muss mit einem Regex gelöst werden :/
BlackJack

@Padidem: Und jetzt suchst Du jemanden der Deine Hausaufgaben für Dich löst? ;-)

Probier doch mal selber. Es gibt dafür ganz brauchbare Programme für den Desktop oder auch Online bei denen man den Beispieltext eingibt und dann den regulären Ausdruck entwickeln kann und gleich eine visuelle Rückmeldung bekommt was der erkennt. Online finde ich https://www.regex101.com/#python ganz nett.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn man es ganz billig lösen möchte, dann kopiert man sich einfach eine der Zeilen und ersetzt die Stelle, wo das Land steht (also zwischen den Anführungszeichen), durch den "Regex-Code" für beliebige sich wiederholende Zeichen. Wenn man darauf hofft, dass sich die Formatierung der zu parsenden Quelle niemals ändert, dann reicht dieses Vorgehen meistens auch schon aus. Empfehlenswert ist es aber trotzdem nicht.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Padidem hat geschrieben:Das kann schon sein...aber die Aufgabenstellung muss mit einem Regex gelöst werden :/
Ich kann durchaus deine Probleme mit der Aufgabe verstehen. Aufgrund des von dir ausgewählten Unterforums für deine Frage schließe ich, dass du reguläre Ausdrücke für ein Netzwerkprotokoll hältst.

Der reguläre Ausdruck müsste übrigens etwa so aussehen: /(\w+)\.png
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

BlackJack

@lackschuh: Das ist IMHO zu fehleranfällig. Da muss ja nur ein Wort drin vorkommen was kein Ländername ist aber mit einem Grossbuchstaben anfängt. Zum Beispiel wenn die das Verzeichnis von `flags` in `Flags` umbenennen, oder wenn jemandem auffällt das die Seite nicht barierrefrei ist oder das <img>-Elemente eigentlich ein `alt`-Attribut haben sollten.
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

und wie kann ich den RegEx mit einer Liste namens "flags" die folgendermaßen aussieht (Auszug) kombinieren?

[ 'image/flag/UnitedKingdom.png',
'image/flag/UnitedStates.png',
'image/flag/UnitedStates.png',
'image/flag/UnitedStates.png',
'image/flag/UnitedStates.png',
'image/flag/UnitedStates.png',
'image/flag/UnitedKingdom.png',
'image/flag/UnitedStates.png',
'image/flag/UnitedStates.png',
'image/flag/UnitedStates.png',
'image/flag/UnitedStates.png',
'image/flag/UnitedStates.png',
'image/flag/UnitedStates.png',
'image/flag/UnitedStates.png',
'image/flag/UnitedStates.png'] ...


.... ich will diese Liste in eine neue Liste (mit Hilfe des Regex) umwandeln, die mir nur die Ländernamen für alle Elemente ausgibt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wieso kombinieren? Was ist das Ziel? Ich kapiere das immer weniger...

Vielleicht postest Du doch mal einen Link zur Aufgabe? ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Padidem: Reguläre Ausdrücke kann man nicht auf Listen anwenden sondern nur auf Zeichenketten (bzw. `str` und `unicode` in Python 2). Wenn Du einen regulären Ausdruck auf jedes Element in einer Liste anwenden möchtest, dann musst Du genau das tun: den auf jedes Element anwenden. Also Code schreiben der das tut. Eine Schleife, oder eine „list comprehension”, oder Du schreibst eine Funktion die *ein* Element verarbeitet und verwendest dann die `map()`-Funktion um die auf jedes Element in der Liste anzuwenden und eine Ergebnisliste zu liefern (Python 2, in Python 3 muss man noch `list()` mit dem Iterator aufrufen den `map()` liefert).
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Padidem hat geschrieben:.... ich will diese Liste in eine neue Liste (mit Hilfe des Regex) umwandeln, die mir nur die Ländernamen für alle Elemente ausgibt.
So etwas teilt man - wie jedes nicht-triviale Programm - in einzelne Bestandteile auf.

Schreib erst einmal eine Funktion, die mit einem String arbeitet und teste diese. Wenn das funktioniert, dann schreibst du eine weitere Funktion die mit einer Liste arbeitet und für jedes einzelne Element die vorher geschriebene Funktion verwendet.
Antworten