2013-05-23 7 views
11

korumak, şu dizeyi bölmek istediğinizPython:</p> <pre><code>a=foo, b=bar, c="foo, bar", d=false, e="false" </code></pre> <p>Bu aşağıdaki listede yol açmalıdır: bir dize, saygı Split ve piton kullanma tırnak

['a=foo', 'b=bar', 'c="foo, bar"', 'd=false', 'e="false'"'] 

yılında shlex kullanarak posix modu ve c için argüman "," ile bölme doğru olarak ele alınır. Ancak, teklifleri kaldırır. Onlara ihtiyacım var çünkü false, "false" ile aynı değildir. Bugüne kadar

Kodum:

import shlex 

mystring = 'a=foo, b=bar, c="foo, bar", d=false, e="false"' 

splitter = shlex.shlex(mystring, posix=True) 
splitter.whitespace += ',' 
splitter.whitespace_split = True 
print list(splitter) # ['a=foo', 'b=bar', 'c=foo, bar', 'd=false', 'e=false'] 
+2

Tekliflerin içinde tırnak işaretleri var mı? –

+0

Evet, onlar (bir ters eğik çizgi ile kaçtı). – Remo

+0

Bunun, daha iyi bir yanıt sağlayan bir http://stackoverflow.com/a/79985/1540600 kopyası olduğunu düşünüyorum. (Shlex.split() 'işlevini kullanın.) – sferencik

cevap

19
>>> s = r'a=foo, b=bar, c="foo, bar", d=false, e="false", f="foo\", bar"' 
>>> re.findall(r'(?:[^\s,"]|"(?:\\.|[^"])*")+', s) 
['a=foo', 'b=bar', 'c="foo, bar"', 'd=false', 'e="false"', 'f="foo\\", bar"'] 
  1. basit alıntı dize eşleşen "[^"]*" regex deseni.
  2. "(?:\\.|[^"])*", belirtilen bir dizeyle eşleşir ve \\. iki karakter tüketir: ters eğik çizgi ve herhangi bir karakter.
  3. [^\s,"], sınırlayıcı olmayan ile eşleşir. (?: |)+ içinde desen 2 ve 3'ü birleştirmek, istenen sonuç olan sınırlayıcı olmayan ve alıntılanmış dizelerin bir dizisiyle eşleşir.
+0

Teşekkür ederim, bir çekicilik gibi çalışır! – Remo

+2

nasıl çalıştığını açıklar ve –

+1

@JasonS 'ya katılıyorum, ama [regex101.com] (https://regex101.com/) yardımcı olabilecek yararlı bir açıklama bölümüne sahiptir, örneğin: https: //i.imgur .com/SJMAQPI.png – blah238

0

Regex bu kolayca yeterli çözebilir:

import re 

mystring = 'a=foo, b=bar, c="foo, bar", d=false, e="false"' 

splitString = re.split(',?\s(?=\w+=)',mystring) 

regex deseni burada bir sözcük karakteri ardından boşluk arar ve sonra bir arzu olarak dize böler ve herhangi tırnak tutar eşittir işareti.

+1

Bu, 'c = "foo, bar ="' –

+0

Fuar noktasını bölebilir. Sanırım bu regex ile ilgili problem, daha az açık bir şey yazmak her zaman beklenmedik vakalarla sizi yakalamış gibi görünüyor ve açık regex bile neler olup bittiğini okumak ve anlamak için korkunç görünebilir. – ydaetskcoR

İlgili konular