2010-12-21 14 views
0

Wie extrahiert man eine Liste von Sub-Strings basierend auf einigen Mustern in Python?Python - Extrahieren einer Liste von Sub-Strings

zum Beispiel

str = 'this {{is}} a sample {{text}}'. 

erwartetes Ergebnis: eine Python-Liste, die enthält ‚ist‘ und ‚Text‘

+0

Möchten Sie nur Teilstrings extrahieren, die in doppelt geschweiften Klammern angezeigt werden? –

+0

@Rafe Ja. Ich brauche nur die Zeichenfolge in diesen geschweiften Klammern. –

+0

Es ist generell keine gute Idee, eine Variable 'string' zu nennen, da es sich um ein häufig verwendetes Python-Modul handelt. –

Antwort

14
>>> import re 
>>> re.findall("{{(.*?)}}", "this {{is}} a sample {{text}}") 
['is', 'text'] 
+0

Funktioniert dieselbe Logik für '[[ist]]'? –

+1

@Siva: Du musst den [s entkommen, weil sie eine Bedeutung innerhalb des regulären Ausdrucks haben: 're.findall (r" \\ [\ ([*])]] "," das ist [[ist] ]] ein Beispiel [[Text]]. ")' – geoffspear

0

Sie können einen regulären Ausdruck verwenden, etwas zu entsprechen, die zwischen {{ und }} auftreten. Geht das so für dich?

Im Allgemeinen, zum Markieren bestimmter Strings in einem großen Textkörper, wird suffix tree nützlich sein.

2

Sie verwenden die folgenden:

res = re.findall("{{([^{}]*)}}", a) 
print "a python list which contains %s and %s" % (res[0], res[1]) 

Prost

+1

Sie müssen '% r' anstelle von'% s' verwenden, sonst erhalten Sie die Anführungszeichen nicht;) – nils

+0

Danke, das wusste ich nicht. Normalerweise hätte ich das Format ('') beispielsweise in die Druckzeichenfolge ('% s') geschrieben. Prost – Morlock

2

"einige Muster" bedeutet "einzelne Wörter zwischen Doppel {} s" Unter der Annahme:

import re

re.findall ('{{(\ w *)}}', Zeichenkette)

Bearbeiten: Andrew Clarks Antwort implementiert "eine beliebige Zeichenfolge überhaupt zwischen Doppel {}"

1

Eine Regex-basierte Lösung ist in Ordnung für Ihr Beispiel, obwohl ich etwas robuster für kompliziertere Eingabe empfehlen würde.

import re 

def match_substrings(s): 
    return re.findall(r"{{([^}]*)}}", s) 

Die Regex von innen nach außen:

[^}] passt alles, was im Inneren Doppel die oben nicht ein ‚}‘ ist
([^}]*) eine beliebige Anzahl von nicht} Zeichen und gruppiert sie
{{([^}]*)}} legt Klammern

Ohne die Klammern oben würde re.findall die gesamte Übereinstimmung zurückgeben (dh ['{{is}}', '{{text}}']. Wenn die Regex jedoch eine Gruppe enthält, wird findall t verwenden Hut stattdessen.

Verwandte Themen