Pandas & NumPy Academy · Les

Patronen matchen met regex

Extraheer substrings en controleer patronen met .str.extract(), .str.contains() en .str.match() met reguliere expressies.

Les 3 van 413 stappen

Patronen matchen met regex is een gratis Pandas & NumPy Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Pandas & NumPy Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Pandas & NumPy Academy bevat in totaal 4 lessen.

Waarom regex in Pandas?

Reguliere expressies (regex) zijn een taal voor het beschrijven van tekenreeks patronen. In Pandas maakt de .str accessor regex beschikbaar via contains(), match(), extract(), findall() en replace(). Regex is het juiste hulpmiddel wanneer uw patronen te complex zijn voor eenvoudige controles met contains/startswith — bijvoorbeeld voor het valideren van e-mailindelingen, het ophalen van telefoonnummers uit vrije tekst of het vinden van alle dollarbedragen in een notitiekolom.

import pandas as pd

df = pd.DataFrame({
    'text': ['Order #12345 placed', 'No order', 'Ref #67890 paid', 'Refund for #11111']
})

# Find rows that contain an order number (# followed by 5 digits)
has_order = df['text'].str.contains(r'#\d{5}', regex=True)
print(df[has_order])
#                  text
# 0  Order #12345 placed
# 2    Ref #67890 paid
# 3  Refund for #11111

.str.contains() met regex

.str.contains(pattern) met regex=True (de standaardwaarde) retourneert een booleaanse Series die overal waar het patroon in de tekenreeks voorkomt True bevat. Gebruik ankers zoals ^ (begin) en $ (einde) om te beperken waar de overeenkomst mag voorkomen. Veelgebruikte toepassing: rijen filteren waarvan een veld aan een indelingsvereiste voldoet, zoals een geldig datum patroon of een correct opgemaakte code.

import pandas as pd

df = pd.DataFrame({
    'code': ['US-001', 'UK-042', 'DE-18', 'FR-', 'us-003']
})

# Valid format: two uppercase letters, hyphen, 3 digits
valid = df['code'].str.contains(r'^[A-Z]{2}-\d{3}$', regex=True)
print(df['code'][valid].tolist())
# ['US-001', 'UK-042']

.str.match() voor matchen met ankers

.str.match(pattern) controleert of elke tekenreeks begint met het patroon (het patroon is aan het begin verankerd). Dat is het verschil met contains(), dat overal in de tekenreeks zoekt. Gebruik match() wanneer alleen het voorvoegsel van de tekenreeks van belang is, en fullmatch() wanneer de volledige tekenreeks met het patroon moet overeenkomen.

import pandas as pd

df = pd.DataFrame({'id': ['ORD001', 'ORD002', 'RET003', 'ORDXYZ']})

# Match rows whose ID starts with 'ORD' followed by digits
orders = df['id'].str.match(r'ORD\d+')
print(df[orders])
#        id
# 0  ORD001
# 1  ORD002

# match() is anchored at start, so 'ORDXYZ' (XYZ not digits) is excluded

.str.extract() voor vastgelegde groepen

.str.extract(pattern) gebruikt vastgelegde groepen () in het regex-patroon om specifieke delen van overeenkomende tekenreeksen op te halen. De methode retourneert een DataFrame met één kolom per vastgelegde groep. Alleen de eerste overeenkomst in elke tekenreeks wordt geretourneerd. Dit is ideaal voor het ophalen van gestructureerde gegevens uit vrije tekst — zoals numerieke waarden, datums of ID's.

import pandas as pd

df = pd.DataFrame({
    'notes': ['Shipped on 2024-01-15', 'Delivered on 2024-03-20', 'Pending', 'Shipped on 2024-07-04']
})

# Extract the date (YYYY-MM-DD) from the notes column
dates = df['notes'].str.extract(r'(\d{4}-\d{2}-\d{2})')
df['shipped_date'] = dates[0]
print(df[['notes', 'shipped_date']])
#                     notes shipped_date
# 0   Shipped on 2024-01-15   2024-01-15
# 1  Delivered on 2024-03-20   2024-03-20
# 2                  Pending          NaN
# 3   Shipped on 2024-07-04   2024-07-04

Vastgelegde groepen een naam geven

U kunt vastgelegde groepen een naam geven met de syntaxis (?P<name>...). Wanneer u benoemde groepen gebruikt met str.extract(), gebruikt het resulterende DataFrame die namen automatisch als kolomkoppen. Zo beschrijft de uitvoer zichzelf en hoeft u de kolommen achteraf niet te hernoemen.

import pandas as pd

df = pd.DataFrame({
    'entry': ['Alice (25, Engineer)', 'Bob (30, Manager)', 'Carol (28, Analyst)']
})

# Named capturing groups
extracted = df['entry'].str.extract(
    r'(?P<name>\w+) \((?P<age>\d+), (?P<role>\w+)\)'
)
print(extracted)
#     name age      role
# 0  Alice  25  Engineer
# 1    Bob  30   Manager
# 2  Carol  28   Analyst

.str.extractall() voor meerdere overeenkomsten

.str.extractall(pattern) vindt alle overeenkomsten van het patroon in elke tekenreeks, niet alleen de eerste. De methode retourneert een DataFrame met een MultiIndex: het buitenste niveau is de oorspronkelijke rij-index en het binnenste niveau (match) telt de overeenkomsten per rij. Dit is handig voor het ophalen van alle getallen, URL's of trefwoorden uit velden met vrije tekst.

import pandas as pd

df = pd.DataFrame({
    'text': ['Call 555-1234 or 555-5678', 'Contact 800-9000', 'No numbers']
})

# Extract all phone patterns
all_phones = df['text'].str.extractall(r'(\d{3}-\d{4})')
print(all_phones)
#              0
#   match
# 0 0      555-1234
#   1      555-5678
# 1 0      800-9000

.str.findall() voor een lijst met overeenkomsten

.str.findall(pattern) retourneert een Series met lijsten, waarbij elke lijst alle overeenkomsten bevat die in de tekenreeks van die rij zijn gevonden. In tegenstelling tot extractall() maakt deze methode geen MultiIndex aan — elke rij krijgt een lijst met overeenkomsten. Dit is handig wanneer u de resultaten in een platte structuur wilt houden of het aantal overeenkomsten per rij wilt tellen.

import pandas as pd

df = pd.DataFrame({
    'text': ['Buy 3 items for $10 each', 'Save $5 on 2 products', 'No deal']
})

# Find all dollar amounts
df['prices'] = df['text'].str.findall(r'\$\d+')
df['price_count'] = df['prices'].str.len()

print(df[['text', 'prices', 'price_count']])
#                         text  prices  price_count
# 0  Buy 3 items for $10 each   [$10]            1
# 1  Save $5 on 2 products      [$5]            1
# 2                   No deal      []            0

Hoofdletterongevoelig matchen met re.IGNORECASE

Regex in Pandas is standaard hoofdlettergevoelig. Geef flags=re.IGNORECASE (of re.I) mee om het patroon hoofdletterongevoelig te maken. Zo hoeft u geen alternatiepatronen zoals [Pp][Yy][Tt][Hh][Oo][Nn] te schrijven wanneer u 'python', 'Python' en 'PYTHON' op dezelfde manier wilt matchen.

import pandas as pd
import re

df = pd.DataFrame({
    'skill': ['Python', 'JAVA', 'javascript', 'PyThOn developer', 'SQL']
})

# Case-insensitive search for python
mask = df['skill'].str.contains('python', flags=re.IGNORECASE, regex=True)
print(df[mask])
#               skill
# 0            Python
# 3  PyThOn developer

Indelingen valideren met volledige overeenkomst

.str.fullmatch(pattern) (toegevoegd in Pandas 1.1) retourneert alleen True wanneer de volledige tekenreeks met het patroon overeenkomt. In tegenstelling tot contains(), dat een deeltekenreeks matcht, is fullmatch gelijk aan het gebruik van de ankers ^...$. Dit is de veiligste manier om te valideren of een indeling aan de vereisten voldoet — voor e-mailadressen, telefoonnummers, postcodes of elk veld met een strikt schema.

import pandas as pd

df = pd.DataFrame({
    'email': ['alice@example.com', 'bob_at_work', 'carol@test', 'dave@org.co']
})

# Simple email validation: word@word.word
valid_email = df['email'].str.fullmatch(r'[\w.+-]+@[\w-]+\.[\w.]+')
print(df[valid_email])
#                email
# 0  alice@example.com
# 3        dave@org.co

Vervangen met regex-terugverwijzingen

Bij het gebruik van str.replace(pattern, repl, regex=True) kan de vervangende tekenreeks terugverwijzingen bevatten, zoals r'\1', om te verwijzen naar de inhoud die in de eerste groep () is vastgelegd. Hiermee kunt u krachtige herformattering uitvoeren — bijvoorbeeld MM/DD/YYYY omzetten naar YYYY-MM-DD of een gematcht woord omringen met HTML-tags.

import pandas as pd

df = pd.DataFrame({'phone': ['(555) 123-4567', '(800) 555-0199', '(212) 867-5309']})

# Reformat to 555-123-4567
df['phone_clean'] = df['phone'].str.replace(
    r'\((\d{3})\) (\d{3})-(\d{4})',
    r'\1-\2-\3',
    regex=True
)
print(df)
#             phone phone_clean
# 0  (555) 123-4567  555-123-4567
# 1  (800) 555-0199  800-555-0199
# 2  (212) 867-5309  212-867-5309

Een gegevens-extractor op basis van regex maken

Hier is een praktisch voorbeeld van begin tot eind: een product-SKU en prijs ophalen uit een rommelige notitiekolom met behulp van benoemde groepen. Dit type extractie komt vaak voor bij het importeren van gegevens uit oudere systemen, waarin meerdere velden tot één tekstveld zijn samengevoegd.

import pandas as pd

df = pd.DataFrame({
    'note': [
        'SKU:A001 price:$49.99 in stock',
        'SKU:B202 price:$12.50 low stock',
        'No SKU available'
    ]
})

extracted = df['note'].str.extract(
    r'SKU:(?P<sku>\w+).*price:\$(?P<price>[\d.]+)'
)
print(extracted)
#     sku  price
# 0  A001  49.99
# 1  B202  12.50
# 2   NaN    NaN

Snelle controle

Test uw begrip van patroonherkenning met regex in Pandas.

Samenvatting van de les

In deze les hebt u geleerd dat str.contains(regex) rijen op basis van een patroon filtert, str.extract() de eerste overeenkomst vastlegt in een DataFrame-kolom (gebruik benoemde groepen voor zelfbeschrijvende uitvoer), str.extractall() alle overeenkomsten per rij vindt met een MultiIndex en str.fullmatch() valideert of de volledige tekenreeks aan een patroon voldoet. Hierna combineren en schonen we meerdere tekstkolommen.

Gratis beginnen

Leer Python met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
30
Lessen
120

Veelgestelde vragen

Is de les “Patronen matchen met regex” gratis?

Ja — de volledige tekst van “Patronen matchen met regex” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Pandas & NumPy Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Pandas & NumPy Academy bevat in totaal 4 lessen.

Wat leer ik in “Patronen matchen met regex”?

Extraheer substrings en controleer patronen met .str.extract(), .str.contains() en .str.match() met reguliere expressies. Je oefent met Pandas & NumPy Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Pandas & NumPy Academy te beginnen?

Ervaring vooraf is niet nodig. Pandas & NumPy Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “Patronen matchen met regex”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Pandas & NumPy Academy?

Ja. Elke les over Pandas & NumPy Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. De accessor .str
  2. Strings splitsen en vervangen
  3. Patronen matchen met regex
  4. Tekstkolommen combineren en opschonen
← Terug naar Pandas & NumPy Academy