Patronen matchen met regex
Extraheer substrings en controleer patronen met .str.extract(), .str.contains() en .str.match() met reguliere expressies.
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-04Vastgelegde 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 [] 0Hoofdletterongevoelig 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 developerIndelingen 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.coVervangen 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-5309Een 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 NaNSnelle 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.
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
- De accessor .str
- Strings splitsen en vervangen
- Patronen matchen met regex
- Tekstkolommen combineren en opschonen