2016-05-25 11 views
0

Ich kann nicht herausfinden, wie diese Zeile mit & lt aufzuspalten, & gt Symbole:Split '< >' line mit Python re

"&lt;c#&gt;&lt;winforms&gt;&lt;type-conversion&gt;&lt;decimal&gt;&lt;opacity&gt;" 

Ich möchte oben von der Linie folgende Liste erhalten:

['c#', 'winforms', 'type-conversion', 'decimal', 'opacity'] 

Was ich versucht, so weit ist re.split, bekam aber kein Glück:

>>> re.split("&lt;(\w+?)&gt;", "&lt;c#&gt;&lt;winforms&gt;&lt;type-conversion&gt;&lt;decimal&gt;&lt;opacity&gt;") 

['&lt;c#&gt;', 'winforms', '&lt;type-conversion&gt;', 'decimal', '', 'opacity', ''] 

Vielen Dank im Voraus!

Antwort

1

split() oder re.split() basierte Lösungen sollten wahrscheinlich in diesem Fall bevorzugt werden, aber hier ist eine Alternative „haben es in der Praxis nicht verwendet werden“ Ansatz mit Hilfe von HTML-Parser beteiligt: ​​

>>> from bs4 import BeautifulSoup 
>>> from HTMLParser import HTMLParser 
>>> 
>>> s = "&lt;c#&gt;&lt;winforms&gt;&lt;type-conversion&gt;&lt;decimal&gt;&lt;opacity&gt;" 
>>> [tag.name for tag in BeautifulSoup(HTMLParser().unescape(s), "html.parser").find_all()] 
[u'c#', u'winforms', u'type-conversion', u'decimal', u'opacity'] 
+0

ich begann diesen Weg gehen nach unten mit 'xml.sax.saxutils.unescape' ... – mgilson

+0

@ mgilson yeah, und ich konnte der Versuchung nicht widerstehen, den HTML-Parsing-Ansatz auszuprobieren, nachdem ich so schrecklich vertraute '<' und '>' gesehen habe :) – alecxe

+0

Ja, das war mein Denken auch. Ich habe diesen Ansatz aufgegeben, weil es keine abschließenden Tags gab, aber anscheinend ist es 'BeautifulSoup' egal. Ich muss versuchen, mich daran zu erinnern. – mgilson

0

Sie verwenden können:

[s for s in re.split("&lt;|&gt;", str) if s] 

die zurückgibt:

'c#', 'winforms', 'type-conversion', 'decimal', 'opacity'] 
2

Wenn wir einige Annahmen über die Eingabezeichenfolge für wahr halten, können wir wahrscheinlich reguläre Ausdrücke alle zusammen vermeiden. Meine Annahmen sind, dass die "Spalten" xml-Escape-Zeichenfolgen sind, die diesem Formular folgen: <col1><col2>...<coln>. Wenn das der Fall ist, dann brauchen wir wirklich nicht die < (also lass es entfernen) und wir können auf > teilen.

>>> s = "&lt;c#&gt;&lt;winforms&gt;&lt;type-conversion&gt;&lt;decimal&gt;&lt;opacity&gt;" 
>>> s.replace('&lt;', '').split('&gt;') 
['c#', 'winforms', 'type-conversion', 'decimal', 'opacity', ''] 

Dies läßt genau eine leere Zeichenkette am Ende der Liste, aber das ist einfach genug, um abschneiden oder handhaben, indem nur während der Verarbeitung übersprungen wird.

+0

Doing Sachen wie dies ohne 'Import' immer wieder Hoffnung in * String literal * Methoden im Gegensatz zu 're' –

+0

@MosesKoledoye - Yeah. Reguläre Ausdrücke sind fantastisch und _super_ nützlich. Ich denke, dass fast jeder Programmierer mindestens grundlegende reguläre Ausdrücke kennen sollte. Nachdem das gesagt wurde, denke ich, dass andere Optionen häufig untersucht werden sollten, bevor man nach regulären Ausdrücken greift, da sie ein paar Stunden, nachdem du sie geschrieben hast, so schwer zu verstehen sind ... – mgilson

+0

Genau! 'regex' ist so mächtig, es kann keine Fliege * anständig töten * –

1

Warum Split verwenden, es verwendet nur eine Regex für Start/Ende cut'n einfügen.
Schneiden Sie den mittleren Mann, es ist schneller.

Verwenden Sie eine findall Art von Funktion mit einem regex wie diese
(den Punkt alle Modifikator, wenn Linien Spanning)

((?:(?!&[gl]t;).)+)(?:&[gl]t;)*

Oder, wenn Sie immer noch diese Spaltung verwenden verwenden müssen

regex

(?:&[gl]t;)+

Verwandte Themen