2016-04-09 13 views
0

Ich versuche, eine Zeichenfolge wie a && b || c && d || e auf beiden && und || mit re.split zu teilen. Ich weiß, dass Sie mehrere Begrenzer haben können, indem Sie re.split("a | b") tun, aber ich weiß nicht, wie man das erreicht: re.split("&& | ||"). Ich versuchte, die Rohre zu entkommen, indem ich re.split("&& | \\|\\|") benutze, aber das funktioniert nicht.Python - Flucht || Beim Aufteilen der Zeichenfolge mit mehreren Trennzeichen

Wie entkomme ich richtig das?

+2

Seien Sie gewarnt, dass Sie sich in Ihrem Regexverständnis irren können. 're.split (" a | b ")' teilt sich auf 'a (Leerzeichen)' und '(Leerzeichen) b'. Ihr eigener Versuch enthält auch diese Leerzeichen (die zufällig in Ihrer Eingabe sind und daher verworfen werden). – usr2564301

+1

Was möchten Sie als Ausgabe? –

Antwort

4

Sie müssen Flucht die | da sie eine besondere Bedeutung hat:

>>> import re 
>>> s = "a && b || c && d || e" 
>>> re.split(r"&&|\|\|", s) 
['a ', ' b ', ' c ', ' d ', ' e'] 

Und auch die Räume um die Begrenzungszeichen Griff:

>>> re.split(r"\s(?:&&|\|\|)\s", s) 
['a', 'b', 'c', 'd', 'e'] 

wo \s ein Leerzeichen Spiele (?:...) ist ein non-capturing group.

+0

Ist es wichtig, den in Klammern gesetzten Ausdruck als nicht erfassend zu markieren? – usr2564301

+1

@RadLexus ja, sonst wären die Trennzeichen auch in der resultierenden Liste vorhanden. Vielen Dank. – alecxe

+0

Ich rannte einfach auf meinen Desktop, um zu überprüfen :) Netter Vorbehalt! Nur eine kurze Nachfassaktion: auf meinem Python 2.7 funktioniert auch ohne das 'r' Präfix:' re.split ("* && * | * \ | \ | *", s) '* und * auch bei doppelten Backslashes! Grundsätzlich funktioniert OPs Originalversuch! (Mit dem zugehörigen Platzproblem habe ich in einem Kommentar erwähnt.) Einen Grund dafür? – usr2564301

0

Hat dieser Regex auf Ihre Bedürfnisse reagiert?

import re 
r = re.compile("(?:&&|\|\|)") 
r.split("a && b || c && d || e") 

Ergebnis:

['a ', ' b ', ' c ', ' d ', ' e'] 
0

Versuchen Sie, diese

data = "a && b || c && d || e" 
import re 
spl = re.split("(?:\|\||&&)",data) 
print spl 

oder auch alle regex mit Negation

import re 
data = "a && b || c && d || e" 
data2 = re.findall("[^&|]{2}",data) 
print data2 
1

str.translate den Job tun könnte verwenden finde ich f Sie wollen in einzelne Elemente aufgeteilt:

s = "a && b || c && d || e" 

print(s.translate(None,"&|").split()) 

Was würde Ihnen:

['a', 'b', 'c', 'd', 'e'] 

Oder die doppelte || ersetzen mit & & und dann aufgeteilt:

s = "a && b || c && d || e" 

print(s.replace(" || "," && ").split(" && ")) 

Oder wenn Sie möchten, um den Abstand zu halten, nur s.replace("||","&&").split("&&"), was auch immer Sie möchten, eine Variation der oben oder kombinieren mit str.strip verwenden können.

Verwandte Themen