Pattern Matching mit regulären Ausdrücken in Python.

Was sind reguläre Audrücke?

Reguläre Ausdrücke, auch als Regex oder RegEx bezeichnet, sind ein spezielles Format für Suchmuster, die von Python (oder auch anderen Programmiersprachen) interpretiert werden können. Sie werden häufig verwendet, um bestimmte Teile eines Strings zu suchen oder zu ersetzen.

Reguläre Ausdrücke enthalten spezielle Zeichen und Zeichenkombinationen, die bestimmte Suchmuster definieren. Zum Beispiel kann das Zeichen “.” jedes Zeichen in einem String entsprechen, während “*” eine beliebige Anzahl von Zeichen bedeutet.

Reguläre Ausdrücke können in Python mit dem re-Modul verwendet werden. Es enthält verschiedene Funktionen, die es ermöglichen, nach bestimmten Mustern in einem String zu suchen oder diese zu ersetzen.

Einfaches Pattern Matching

In Python kann man Pattern Matching mit regulären Ausdrücken machen. Reguläre Ausdrücke sind ein spezielles Format für Suchmuster, die von Python interpretiert werden können.

Hier ist ein Beispiel, wie man reguläre Ausdrücke in Python verwendet:

# Import the regular expression module
import re

# Define the string to search
my_string = "The quick brown fox jumps over the lazy dog."

# Define the pattern to search for
my_pattern = "quick"

# Use the re.search() function to search for the pattern in the string
match = re.search(my_pattern, my_string)

# Print the result of the search
if match:
  print("Match found!")
else:
  print("No match found.")

In diesem Beispiel suchen wir nach dem Wort “quick” in dem String “The quick brown fox jumps over the lazy dog.” Wir verwenden die re.search()-Funktion, um nach dem Pattern zu suchen, und dann prüfen wir, ob ein Match gefunden wurde.

Die Ausgabe dieses Beispiels wäre:

Match found!

Man kann auch komplexere Muster in regulären Ausdrücken definieren, um spezifischere Suchergebnisse zu erzielen.

Teile von Strings ersetzen

In Python kann man mit Regex (Regular Expressions) auch ersetzen. Regex sind ein spezielles Format für Suchmuster, die von Python interpretiert werden können.

Hier ist ein Beispiel, wie man Regex in Python verwendet, um einen Teil eines Strings zu ersetzen:

# Import the regular expression module
import re

# Define the string to be replaced
my_string = "The quick brown fox jumps over the lazy dog."

# Define the pattern to search for
my_pattern = "quick"

# Define the replacement string
my_replacement = "fast"

# Use the re.sub() function to search for the pattern in the string and replace it
replaced_string = re.sub(my_pattern, my_replacement, my_string)

# Print the result of the replacement
print(replaced_string)

In diesem Beispiel suchen wir nach dem Wort “quick” in dem String “The quick brown fox jumps over the lazy dog.” und ersetzen es durch das Wort “fast”. Wir verwenden die re.sub()-Funktion, um nach dem Pattern zu suchen und es zu ersetzen.

Die Ausgabe dieses Beispiels wäre:

The fast brown fox jumps over the lazy dog.

Komplexere Muster ersetzen

Man kann auch komplexere Muster in Regex definieren, um spezifischere Ersetzungen zu erzielen.

Natürlich kann man jetzt auch nach komplexeren Audrücken suchen und entsprechend ersetzen. Wenn man könnte z.B wenn man in einem Stück HTML-Code alle http:// durch https:// ersetzen möchte, da und nun nur nach dem Pattern “http” sucht, dann würden sowohl die existierenden http => https, aber auch die existierenden https => httpss ersetzt. Um das zu verhindern kann man mit folgendem Pattern arbeiten:

# Import the regular expression module
import re

# Define the string to be replaced
my_string = "This website uses http, but some websites use https instead."

# Define the pattern to search for
my_pattern = r"http(s)?:"

# Define the replacement string
my_replacement = "https:"

# Use the re.sub() function to search for the pattern in the string and replace it
replaced_string = re.sub(my_pattern, my_replacement, my_string)

# Print the result of the replacement
print(replaced_string)

In diesem Beispiel suchen wir nach dem Wort “http” oder “https” gefolgt von einem Doppelpunkt in dem String “This website uses http, but some websites use https instead.” und ersetzen es durch das Wort “https:”.

Die Ausgabe dieses Beispiels wäre:

This website uses https:, but some websites use https: instead.

Man muss “r”-Präfix vor dem regulären Ausdruck zu verwenden, um ihn als raw string zu kennzeichnen. Dies ist wichtig, da reguläre Ausdrücke normalerweise bestimmte Zeichen (wie “?”) haben, die von Python interpretiert werden können. Das “r”-Präfix deaktiviert diese Interpretation und ermöglicht es uns, genau das zu suchen, was wir angeben.

HTML-Tags inklusive Klassen entfernen

Ein weiteres Beispiel ist das entfernen von Tags inklusive Klassen, ohne den darin enthaltenen Text zu entfernen. Nehmen wir an, wir wollen alle spans aus einem Stück HTML Code entfernen. Das geht dann so:

# Import the regular expression module
import re

# Define the string to be modified
my_html = "<p>This is <span>some</span> text</p>"

# Define the pattern to search for
my_pattern = r"<span.*?>(.*?)</span>"

# Define the replacement string
my_replacement = "\\1"

# Use the re.sub() function to search for the pattern in the string and replace it
modified_html = re.sub(my_pattern, my_replacement, my_html)

# Print the result of the replacement
print(modified_html)

In diesem Beispiel suchen wir nach allen Spans im HTML-String und ersetzen sie durch den Inhalt des Spans. Wir verwenden auch eine Rückverweisung (\\1) im Ersatzstring, um den Inhalt des Spans im Ersatzstring zu referenzieren.

(Tipp: in vielen Editoren (z.B. Sublime) muss man statt \\1 => $1 schreiben und erhält denselben Effekt.)

Die Ausgabe dieses Beispiels wäre:

This is some text

Es ist zu beachten, dass dieses Beispiel nur für einfache Fälle von HTML gilt und möglicherweise nicht für komplexere HTML-Dokumente funktioniert. Für eine professionellere Lösung empfiehlt es sich, ein HTML-Parsing-Bibliothek wie BeautifulSoup zu verwenden.

Automatisierung mit Python: Ordnung im Downloads-Ordner

Schon eine Weile nervt mich die wenige Übersicht in meinem Download-Ordner. Ich habe daher dieses kleine Projekt aufgesetzt, dass basierend auf Dateityp nach Endung Download-Files in Unterordnern:

    • pdf
    • else
    • data
    • image
    • video
    • document
    • programming

sortiert. Außerdem wird als Präfix das aktuelle Datum nach Format: YYYY-MM-DD_ vorangesetzt. Technisch handelt es sich um eine Python Script auf Basis von watchdog. Dieses wird bei Systemstart durch einen Service manage-downloads.service in systemd gestartet. Dafür liegt im /lib/systemd/system eine Datei mit dem Namen anage-downloads.service.

Wenn ihr es ausprobieren wollt, findet ihr den Code und eine Anleitung zum Anpassen an euer System hier: https://github.com/genughaben/python-automation.

Wie man es auf einem Mac zum Laufen bekommt. werde ich noch ergänzen – sofern nicht jemand von euch schneller ist.

Weitere Ideen und Anregungen findet ihr hier:

How to add an new conda environment as kernel to jupyter?

Often I want to use newly created conda enviroments also from Jupyter. Therefore the enviroment needs to be added as kernel to Jupyter. You do that like so.

First make sure pip and ipykernel are installed / up-to-date.

> conda install pip
> conda install ipykernel

And then enter:

conda activate <env-to-add>
> python -m ipykernel install --user --name <env-to-add> --display-name "<env-to-add>"

Reference: https://ipython.readthedocs.io/en/stable/install/kernel_install.html