Pandas & NumPy Academy · Lektion

Mönstermatchning med regex

Extrahera delsträngar och kontrollera mönster med .str.extract(), .str.contains() och .str.match() med reguljära uttryck.

Lektion 3 av 413 steg

Mönstermatchning med regex är en gratis lektion i Pandas & NumPy Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Pandas & NumPy Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Pandas & NumPy Academy innehåller totalt 4 lektioner.

Varför regex i Pandas?

Reguljära uttryck (regex) är ett språk för att beskriva strängmönster. I Pandas tillhandahåller .str accessor regex-funktionalitet genom contains(), match(), extract(), findall() och replace(). Regex är rätt verktyg när mönstren är för komplexa för enkla contains-/startswith-kontroller – till exempel för att validera e-postformat, extrahera telefonnummer från fritext eller hitta alla dollarbelopp i en anteckningskolumn.

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() med regex

.str.contains(pattern) med regex=True (standardvärdet) returnerar en boolesk Series som är True överallt där mönstret matchar någonstans i strängen. Använd ankare som ^ (början) och $ (slutet) för att begränsa var matchningen får ske. Vanliga användningsområden är att filtrera rader där ett fält följer ett visst formatkrav, till exempel ett giltigt datummönster eller en korrekt formaterad kod.

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() för förankrad matchning

.str.match(pattern) kontrollerar om varje sträng börjar med mönstret (det är förankrat i början). Detta skiljer metoden från contains(), som söker var som helst i strängen. Använd match() när Ni bara bryr Er om strängens prefix, och fullmatch() när hela strängen måste matcha mönstret.

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() för infångningsgrupper

.str.extract(pattern) använder infångningsgrupper () i regex-mönstret för att hämta specifika delar av matchande strängar. Metoden returnerar en DataFrame med en kolumn per infångningsgrupp. Endast den första matchningen i varje sträng returneras. Detta passar utmärkt för att extrahera strukturerade data som finns inbäddade i fritext – till exempel numeriska värden, datum eller ID:n.

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

Namngivna infångningsgrupper

Ni kan namnge infångningsgrupper med syntaxen (?P<name>...). När Ni använder namngivna grupper med str.extract() använder den resulterande DataFrame automatiskt dessa namn som kolumnrubriker. Utdata blir därmed självförklarande utan att kolumnerna behöver döpas om i efterhand.

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() för flera matchningar

.str.extractall(pattern) hittar alla matchningar av mönstret i varje sträng, inte bara den första. Metoden returnerar en DataFrame med ett MultiIndex: den yttre nivån är det ursprungliga radindexet och den inre nivån (match) räknar matchningarna per rad. Detta är användbart för att extrahera alla tal, URL:er eller nyckelord från fritextfält.

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() för en lista med matchningar

.str.findall(pattern) returnerar en Series med listor, där varje lista innehåller alla matchningar som hittades i strängen på den raden. Till skillnad från extractall() skapas inget MultiIndex – varje rad får en lista med matchningar. Detta är praktiskt när Ni vill behålla resultaten i en platt struktur eller räkna matchningar per rad.

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

Skiftlägesokänslig matchning med re.IGNORECASE

Som standard är regex i Pandas skiftlägeskänsligt. Skicka med flags=re.IGNORECASE (eller re.I) för att göra mönstret skiftlägesokänsligt. Då behöver Ni inte skriva alternationsmönster som [Pp][Yy][Tt][Hh][Oo][Nn] när Ni vill matcha 'python', 'Python' och 'PYTHON' på samma sätt.

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

Validera format med fullständig matchning

.str.fullmatch(pattern) (tillagt i Pandas 1.1) returnerar True endast när hela strängen matchar mönstret. Till skillnad från contains(), som matchar en delsträng, motsvarar fullmatch förankring med ^...$. Detta är det säkraste sättet att validera att ett format följer kraven – för e-postadresser, telefonnummer, postnummer eller fält med ett 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

Ersätta med regex-bakreferenser

När Ni använder str.replace(pattern, repl, regex=True) kan ersättningssträngen innehålla bakreferenser som r'\1' för att referera till innehållet som fångats i den första gruppen (). Detta möjliggör kraftfull omformatering – till exempel att ändra MM/DD/YYYY till YYYY-MM-DD eller omsluta ett matchat ord med HTML-taggar.

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

Bygga en regex-baserad dataextraherare

Här är ett praktiskt exempel från början till slut: extrahera produkt-SKU och pris från en rörig anteckningskolumn med hjälp av namngivna grupper. Den här typen av extrahering är vanlig när data importeras från äldre system där flera fält har sammanfogats till ett enda textfält.

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

Snabb kontroll

Testa Er förståelse av mönstermatchning med regex i Pandas.

Lektionssammanfattning

I den här lektionen lärde Ni Er att str.contains(regex) filtrerar rader efter mönster, att str.extract() fångar den första matchningen i en DataFrame-kolumn (använd namngivna grupper för självförklarande utdata), att str.extractall() hittar alla matchningar per rad med ett MultiIndex och att str.fullmatch() validerar att hela strängen följer ett mönster. Härnäst kombinerar och rensar vi flera textkolumner.

Gratis att börja

Lär dig Python med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
30
Lektioner
120

Vanliga frågor

Är lektionen ”Mönstermatchning med regex” gratis?

Ja – hela texten till ”Mönstermatchning med regex” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Pandas & NumPy Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Pandas & NumPy Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Mönstermatchning med regex”?

Extrahera delsträngar och kontrollera mönster med .str.extract(), .str.contains() och .str.match() med reguljära uttryck. Ni övar på Pandas & NumPy Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Pandas & NumPy Academy?

Du behöver inga förkunskaper. Utbildningen i Pandas & NumPy Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Mönstermatchning med regex”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Pandas & NumPy Academy-lektionen?

Ja. Varje Pandas & NumPy Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Attributet .str
  2. Dela upp och ersätta strängar
  3. Mönstermatchning med regex
  4. Kombinera och rensa textkolumner
← Tillbaka till Pandas & NumPy Academy