2017-12-21 2 views
2

ich folgende Python-Code haben (ich will das erste Spiel einer bestimmten Anzahl in einem Textfeld):Anwenden re.search Funktion Spalte in Python

import numpy as np 
import pandas 

data = {'A': [1, 2, 3], 'B': ['bla 4044 bla', 'bla 5022 bla', 'bla 6045 bla']} 
df = pandas.DataFrame(data) 

def fun_subjectnr(column): 
    column = str(column) 
    subjectnr = re.search(r"(\b[4][0-1][0-9][0-9]\b)",column) 
    subjectnr1 = re.search(r"(\b[2-3|6-8][0-9][0-9][0-5]\b)",column) 
    subjectnr = np.where(subjectnr == "" and subjectnr1 != "", subjectnr1, 
    subjectnr) 
    return subjectnr1 

df['C'] = df['B'].apply(fun_subjectnr) 

gewünschte Ausgabe:

A B    C 
1 bla 4044 bla 4044 
2 bla 5022 bla None 
3 bla 6045 bla 6045 

Es scheint nicht zu funktionieren. Wenn ich dem Regex-Code eine [0] hinzufüge, ergibt sich ein Fehler ... (subjecnr = re.search (r "(\ b [4] [0-1] [0-9] [0-9] \ b) ", Spalte) [0])

Wer weiß, was zu tun ist? Danke im Voraus!

+0

Können Sie erklären, wie Sie diese Ausgabe erhalten? Sie sollten 'Series.str.findall' verwenden. –

+0

Ich habe es versucht und es hat funktioniert, aber ich will nicht alle Spiele, nur das erste Spiel ... –

+0

Okay, dann 'Series.str.extract'. Meine Frage ist, was genau versuchst du zu tun? Warum ist das zweite Ergebnis None? –

Antwort

2

Sie können dies mit str.extract tun. Sie können auch Ihr Muster ein wenig verdichten, wie ich unten zeige.

p = r'\b(4[0-1]\d{2}|(?:[2-3]|[6-8])\d{2}[0-5])\b' 
df['C'] = df.B.str.extract(p, expand=False) 

df 

    A    B  C 
0 1 bla 4044 bla 4044 
1 2 bla 5022 bla NaN 
2 3 bla 6045 bla 6045 

Dies sollte viel schneller sein als apply aufrufen.


Einzelheiten

\b     # word boundary 
(     # first capture group 
    4    # match digit 4 
    [0-1]   # match 0 or 1 
    \d{2}   # match any two digits 
| 
    (?:    # non-capture group (prevent ambiguity during matching) 
     [2-3]  # 2 or 3 
     |   # regex OR metacharacter 
     [6-8]  # 6, 7, or 8 
    ) 
    \d{2}   # any two digits 
    [0-5]   # any digit b/w 0 and 5 
) 
\b 
+1

Danke für die Antwort und den Regex-Vorschlag, es funktioniert (und ich reduzierte meine Menge an Code :))! –

Verwandte Themen