2016-04-09 4 views
0

a && b || c && d || eのような文字列を&&||に分割しようとしていますが、re.splitを使用しています。 re.split("a | b")を実行して複数の区切り文字を使用できることはわかっていますが、これを実現する方法はわかりません:re.split("&& | ||")。私はre.split("&& | \\|\\|")を使用してパイプをエスケープしようとしましたが、これは動作しません。Python - エスケープ||

これを正しくエスケープするにはどうすればよいですか?

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

そして、また、区切り文字の周りにスペースを処理するために::

\sはスペース文字に一致し
>>> re.split(r"\s(?:&&|\|\|)\s", s) 
['a', 'b', 'c', 'd', 'e'] 

それは特別な意味を持っているので、あなたがエスケープ|に必要

+2

あなたの正規表現を誤解している可能性があることに注意してください。 're.split(" a | b ")'はa(スペース)と(スペース)bで分割されます。あなた自身の試みには、これらのスペースも含まれています(あなたの入力にあるので、それらは破棄されます)。 – usr2564301

+1

出力として何をしたいですか? –

答えて

4

(?:...)non-capturing groupです。

+0

カッコで囲まれた式を非キャプチャとしてマークすることは重要ですか? – usr2564301

+1

@RadLexusええ、それ以外の場合は区切り記号も結果リストに表示されます。ありがとう。 – alecxe

+0

ちょうど確認するために私のデスクトップに走った:) Nice caveat!ちょっと速いフォローアップの質問です:私のPython 2.7では 'r'プレフィックスなしでも動作します:' re.split( "* && * | * \ | \ | *"、s) '*と*は二重バックスラッシュでもあります!基本的には、OPのオリジナルの試みが動作します! (私がコメントで言及した関連するスペースの問題と)。その理由は何ですか? – usr2564301

0

この正規表現はあなたのニーズに対応しましたか?

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

結果:

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

は試してみてください。この

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

か、他の仕事をするかもしれない正規表現否定

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

str.translateですべてを見つける使用してIあなたを与えるだろうどの

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

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

:F君は、個々の要素に分割したい

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

またはDOUBLEを交換する||あなたは上記のいくつかのバリエーションを使用するかstr.stripと組み合わせることができ、好きな

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

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

それとも、間隔を維持したい場合は、単にs.replace("||","&&").split("&&")、:& &、その後、スプリット付き。

関連する問題