2012-03-26 23 views
1

Wenn ich eine Zeichenfolge habe s = "Name: John, Name: Abby, Name: Kate". Wie extrahiere ich alles zwischen Name: und ,? Also würde ich ein Array haben wollen a = John, Abby, KateRegex-Extrakt-Element nach String

Vielen Dank!

Antwort

3

Keine Notwendigkeit für eine regex:

>>> s = "Name: John, Name: Abby, Name: Kate" 
>>> [x[len('Name: '):] for x in s.split(', ')] 
['John', 'Abby', 'Kate'] 

Oder auch:

>>> prefix = 'Name: ' 
>>> s[len(prefix):].split(', ' + prefix) 
['John', 'Abby', 'Kate'] 

Nun, wenn Sie noch ein regulärer Ausdruck ist besser geeignet denken:

>>> import re 
>>> re.findall('Name:\s+([^,]*)', s) 
['John', 'Abby', 'Kate'] 
1

Die interessante Frage ist, wie Sie würden unter den vielen Möglichkeiten wählen, dies in Python zu tun. Die Antwort mit "Split" ist nett, wenn Sie sicher sind, dass das Format genau sein wird. Wenn Sie einen Schutz vor geringfügigen Formatänderungen wünschen, kann ein regulärer Ausdruck nützlich sein. Sie sollten darüber nachdenken, welche Teile des Formats am ehesten stabil sind, und diese in Ihrem regulären Ausdruck erfassen, während Sie den anderen Flexibilität lassen. Hier ist ein Beispiel, die davon ausgeht, dass die Namen alphabetisch sind, und dass das Wort „Name“ und der Darm sind stabil:

import re 
s = "Name: John, Name: Abby, Name: Kate" 
names = [i.group(1) for i in re.finditer("Name:\s+([A-Za-z]*)", s)] 
print names 

Sie könnten stattdessen in einem Namen für Bindestriche oder andere Zeichen zulassen möchten; Sie können dies tun, indem Sie den Text in [A-Za-z] ändern. Eine gute Seite über Python reguläre Ausdrücke mit vielen Beispielen ist http://docs.python.org/howto/regex.html.

+0

Das Listenverständnis ist exakt äquivalent zu 're.findall (" Name: \ s + ([A-Za-z] *) ", s)' –

+0

Guter Punkt. Ich überlegte, Findall zu benutzen. Ich persönlich finde mich selbst häufiger mit finditer, weil es die Aufgabe ist, durchzugehen und etwas mit jedem gefundenen Element zu tun, also entschied ich mich für den finderiter im Beispiel, obwohl das Listenverständnis hier ein bisschen komisch ist. –

1

paar Möglichkeiten, dies zu tun

>>> s 
'Name: John, Name: Abby, Name: Kate' 

Methode 1:

>>> [x.strip() for x in s.split("Name:")[1:]] 
['John,', 'Abby,', 'Kate'] 

Methode 2:

>>> [x.rsplit(":",1)[-1].strip() for x in s.split(",")] 
['John', 'Abby', 'Kate'] 

Methode 3:

>>> [x.strip() for x in re.findall(":([^,]*)",s)] 
['John', 'Abby', 'Kate'] 

Methode 4:

>>> [x.strip() for x in s.replace('Name:','').split(',')] 
['John', 'Abby', 'Kate'] 

Beachten Sie auch, wie ich immer angewendet Streifen konsequent, die Sinn macht, wenn ihre mehrere Räume zwischen sein ‚Name:‘ Token und den tatsächlichen Namen.

Methode 2 und 3 können in einer allgemeineren Weise verwendet werden.