Python-re-Modul
Pythonsre-Modul ist ein Standardbibliotheksmodul für den Umgang mit regulären Ausdrücken.
Reguläre Ausdrücke (Regular Expression, abgekürzt regex oder regexp) sind ein leistungsstarkes Werkzeug zum Abgleichen, Suchen und Bearbeiten von Text.
Indem Sieredem Modul können Sie reguläre Ausdrücke in Python verwenden, um Zeichenketten zu verarbeiten.
Warum das re-Modul verwenden?
In der Textverarbeitung müssen wir oft nach bestimmten Mustern suchen oder bestimmte Zeichen ersetzen. Zum Beispiel das Validieren von E-Mail-Adressen, das Extrahieren von Links aus Webseiten oder das Formatieren von Text. Das manuelle Schreiben von Code, um diese Aufgaben zu erledigen, kann sehr mühsam sein, während reguläre Ausdrücke eine prägnante und effiziente Möglichkeit bieten, diese Probleme zu lösen.
Grundlegende Verwendung des re-Moduls
1. Importieren Sie das re-Modul
Bevor Sieredas Modul, müssen Sie es zuerst importieren:
import re
2. Häufige Funktionen des re-Moduls
2.1 re.match()
re.match()Die Funktion wird verwendet, um einen regulären Ausdruck vom Anfang einer Zeichenkette an abzugleichen. Wenn der Abgleich erfolgreich ist, gibt sie ein Match-Objekt zurück; andernfalls gibt sie zurückNone。
Beispiel
pattern = r"hello"
text = "hello world"
match = re.match(pattern, text)
if match:
print("Match successful:", match.group())
else:
print("Match failed")
Ausgabe:
匹配成功: hello
2.2 re.search()
re.search()Die Funktion wird verwendet, um die erste Übereinstimmung eines regulären Ausdrucks in einer Zeichenkette zu suchen. Im Gegensatz zure.match()anders,re.search()erfordert nicht, dass die Übereinstimmung am Anfang der Zeichenkette beginnt.
Beispiel
pattern = r"world"
text = "hello world"
match = re.search(pattern, text)
if match:
print("Match successful:", match.group())
else:
print("Match failed")
Ausgabe:
匹配成功: world
2.3 re.findall()
re.findall()Die Funktion wird verwendet, um alle Teilstrings in einer Zeichenkette zu finden, die mit dem regulären Ausdruck übereinstimmen, und gibt eine Liste zurück.
Beispiel
pattern = r"\d+"
text = "Es gibt 3 Äpfel und 5 Orangen."
matches = re.findall(pattern, text)
print("Gefundene Zahlen:", matches)
Ausgabe:
找到的数字: ['3', '5']
2.4 re.sub()
re.sub()Die Funktion wird verwendet, um die Teile einer Zeichenkette zu ersetzen, die mit dem regulären Ausdruck übereinstimmen.
Beispiel
pattern = r"Apfel"
text = "Ich habe einen Apfel."
new_text = re.sub(pattern, "Banane", text)
print("Ersetzter Text:", new_text)
Ausgabe:
替换后的文本: I have an banana.
Grundlegende Syntax regulärer Ausdrücke
1. Normale Zeichen
Normale Zeichen (wie Buchstaben, Ziffern) stimmen direkt mit sich selbst überein.
Beispiel
pattern = r"Katze"
text = "Die Katze ist auf der Matte."
match = re.search(pattern, text)
if match:
print("Match successful:", match.group())
Ausgabe:
匹配成功: cat
2. Sonderzeichen
In regulären Ausdrücken gibt es einige Sonderzeichen, die spezielle Bedeutungen haben. Zum Beispiel:
.: Entspricht einem beliebigen einzelnen Zeichen (außer Zeilenumbruch).*: Entspricht dem vorangehenden Zeichen null oder mehrmals.+: Entspricht dem vorangehenden Zeichen ein oder mehrmals.?: Entspricht dem vorangehenden Zeichen null oder einmal.\d: Entspricht einem beliebigen Ziffernzeichen (äquivalent zu[0-9])。\w: Entspricht einem beliebigen Buchstaben, einer Ziffer oder einem Unterstrichzeichen (äquivalent zu[a-zA-Z0-9_])。
Beispiel
pattern = r"\d+"
Text = "Der Preis beträgt 100 Dollar."
match = re.search(pattern, text)
if match:
print("Match successful:", match.group())
Ausgabe:
匹配成功: 100
3. Zeichensätze
Zeichensätze werden verwendet, um mit einem beliebigen einzelnen Zeichen aus einer Menge übereinzustimmen. Zum Beispiel,[abc]matchesa、boderc。
Beispiel
Muster = r"[aeiou]"
text = "Hallo Welt!"
matches = re.findall(pattern, text)
print("Vokale gefunden:", matches)
Ausgabe:
找到的元音字母: ['e', 'o', 'o']
4. Gruppierung
Durch Gruppierung können Sie mehrere Zeichen zusammenfassen und mit ihnen arbeiten. Zum Beispiel:(abc)matchesabc。
Beispiel
pattern = r"(ab)+"
text = "ababab"
match = re.search(pattern, text)
if match:
print("Match successful:", match.group())
Ausgabe:
匹配成功: ababab
Praktische Übungen
Übung 1: E-Mail-Adressen validieren
Schreibe einen regulären Ausdruck, um das Format einer E-Mail-Adresse zu validieren.
Beispiel
pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
email = "[email protected]"
if re.match(pattern, email):
print("Gültige E-Mail-Adresse")
else:
print("Ungültige E-Mail-Adresse")
Übung 2: Telefonnummern extrahieren
Einen regulären Ausdruck schreiben, um Telefonnummern aus Text zu extrahieren.
Beispiel
pattern = r"\d{3}-\d{3}-\d{4}"
text = "Meine Telefonnummer ist 123-456-7890."
match = re.search(pattern, text)
if match:
print("Gefundene Telefonnummern:", match.group())
1. Kernfunktionen
| Methode | Beschreibung | Beispiel |
|---|---|---|
re.compile(pattern) |
Einen regulären Ausdruck vorkompilieren (verbessert die Leistung bei Wiederverwendung) | pat = re.compile(r'\d+') |
re.search(pattern, string) |
Nach dem ersten Treffer in einer Zeichenkette suchen | re.search(r'\d+', 'a1b2')→ Treffer'1' |
re.match(pattern, string) |
Vom Anfang der Zeichenkette an übereinstimmen | re.match(r'\d+', '123a')→ Treffer'123' |
re.fullmatch(pattern, string) |
Die gesamte Zeichenkette stimmt vollständig überein | re.fullmatch(r'\d+', '123')→ Treffer'123' |
re.findall(pattern, string) |
Eine Liste aller nicht überlappenden Treffer zurückgeben | re.findall(r'\d+', 'a1b22c') → ['1', '22'] |
re.finditer(pattern, string) |
Einen Iterator aller Treffer zurückgeben (einschließlich Positionsinformationen) | for m in re.finditer(r'\d+', 'a1b2'): print(m.group()) |
re.sub(pattern, repl, string) |
Treffer ersetzen | re.sub(r'\d+', 'X', 'a1b2') → 'aXbX' |
re.split(pattern, string) |
Die Zeichenkette anhand von Treffern aufteilen | re.split(r'\d+', 'a1b2c') → ['a', 'b', 'c'] |
re.escape() |
Sonderzeichen escapen | re.escape("C:\\Users\\test.txt")
|
re.purge() |
Cache leeren | re.purge()
|
2. Match-Objekt (Match) Methoden/Attribute
| Methode/Attribut | Beschreibung | Beispiel |
|---|---|---|
group() |
Die gesamte übereinstimmende Zeichenfolge zurückgeben | m.group() → 'abc' |
group(n) |
Den Inhalt der n-ten Capture-Gruppe zurückgeben | m = re.search(r'(\d)(\d)', '12'); m.group(1) → '1' |
groups() |
Ein Tupel aller Capture-Gruppen zurückgeben | m.groups() → ('1', '2') |
start()/end() |
Start-/Endposition der Übereinstimmung | m.start() → 0 |
span() |
Den Übereinstimmungsbereich zurückgeben(start, end) |
m.span() → (0, 2) |
3. Metazeichen regulärer Ausdrücke (teilweise)
| Metazeichen | Beschreibung | Beispiel-Übereinstimmung |
|---|---|---|
. |
Ein beliebiges Zeichen finden (außer Zeilenumbruch) | a.c → 'abc' |
\d |
Eine Ziffer finden | \d+ → '123' |
\D |
Ein Nicht-Ziffer-Zeichen finden | \D+ → 'abc' |
\w |
Ein Wortzeichen finden (Buchstabe, Ziffer, Unterstrich) | \w+ → 'Ab_1' |
\W |
Ein Nicht-Wortzeichen finden | \W+ → '!@#' |
\s |
Ein Whitespace-Zeichen finden (Leerzeichen, Tabulator usw.) | \s+ → ' \t' |
\S |
Ein Nicht-Whitespace-Zeichen finden | \S+ → 'abc' |
[] |
Zeichensatz | [A-Za-z]→ ein beliebiger Buchstabe |
^ |
Den Anfang einer Zeichenkette finden | ^\d+→ Ziffer am Anfang |
$ |
Das Ende einer Zeichenkette finden | \d+$→ Ziffer am Ende |
* |
Das vorhergehende Zeichen null oder mehr Male finden | a* → '', 'aaa' |
+ |
Entspricht dem vorangehenden Zeichen ein- oder mehrmals | a+ → 'a', 'aaa' |
? |
Entspricht dem vorangehenden Zeichen null oder einmal | a? → '', 'a' |
{m,n} |
Entspricht dem vorangehenden Zeichen m bis n Mal | a{2,3} → 'aa', 'aaa' |
| |
ODER-Operation | cat|dog → 'cat'oder'dog' |
() |
Erfassungsgruppe | (\d+)→ Ziffern extrahieren |
4. Kompilierungsflags (flagsparameter)
| Flag | Beschreibung | Beispiel |
|---|---|---|
re.IGNORECASE (re.I) |
Groß-/Kleinschreibung ignorieren | re.search(r'abc', 'ABC', re.I) |
re.MULTILINE (re.M) |
Mehrzeilenmodus (beeinflusst^und$) |
re.findall(r'^\d+', '1\n2', re.M) → ['1', '2'] |
re.DOTALL (re.S) |
Lassen.Entspricht allen Zeichen einschließlich Zeilenumbrüchen |
re.search(r'a.*b', 'a\nb', re.S) |
re.ASCII |
Lassen\w, \Wusw. nur ASCII-Zeichen entsprechen |
re.search(r'\w+', 'こん', re.ASCII)→ kein Treffer |
re.VERBOSE (re.X) |
Kommentare und Leerzeichen im Regex zulassen | re.compile(r'''\d+ # 匹配数字''', re.X) |
Beispiel
1. E-Mail-Adressen extrahieren
Beispiel
text = "Kontakt: [email protected], [email protected]"
emails = re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', text)
print(emails) # Ausgabe: ['[email protected]', '[email protected]']
2. Datumsformate ersetzen
Beispiel
new_str = re.sub(r'(\d{2})-(\d{2})-(\d{4})', r'\3year\1month\2day', date_str)
print(new_str) # Ausgabe: "Heute ist 2023-05-15"
3. Abgleich mit mehreren Bedingungen
Beispiel
^(?P<username>\w+) # Benutzername
:(?P<password>\S+) # Passwort
@(?P<domain>\w+\.\w+) # Domäne
$''', re.VERBOSE)
m = pattern.match("john:[email protected]")
if m:
print(m.groupdict()) # Ausgabe: {'username': 'john', 'password': 'pass123', 'domain': 'example.com'}
4. Komplexe Zeichenketten aufteilen
Beispiel
parts = re.split(r'\d+', text)
print(parts) # Ausgabe: ['Apple', 'Banana', 'Cherry', 'Date']
Hinweise
-
Roh-Strings: Es wird empfohlen, Roh-Strings für reguläre Ausdrücke zu verwenden (
r'\d'), um Konflikte mit Escape-Zeichen zu vermeiden. -
Gieriges Matching: Standardmäßig gieriges Matching (z. B.
.*die längstmögliche Übereinstimmung erzielt), müssen Sie verwenden,.*?um nicht-gieriges Matching zu implementieren. -
Leistungsoptimierung: Häufig verwendete reguläre Ausdrücke sollten vorrangig
re.compile()Vorcompilierung verwenden. -
Backtracking-Probleme: Komplexe reguläre Ausdrücke können Leistungsprobleme verursachen (wie verschachtelte Quantifizierer
(a+)+)。