2013-11-21 14 views
6

Bir dizgeyi bir sınırlayıcıyla bir listeye bölme (, diyelim) ama sınırlayıcı karakter yalnızca belirli bir sargıya sarılmamışsa sınırlayıcı olarak kabul edilmelidir. desen, benim özel durumda <>. IOW, virgül <>'da yuvalandığında, bir sınırlayıcı olarak yok sayılır ve sınırlandırılmaması gereken normal bir karakter olur.Yalnızca belirli bir desene sarılmamışsa dizgeyi ayırma dizesi

Yani aşağıdaki dizeyi varsa: ikinci belirteci bölünmüş çünkü

"first token, <second token part 1, second token part 2>, third token" 

o , tarafından Sadece basit bölünmüş yapamaz demek

list[0] = "first token" 
list[1] = "second token part 1, second token part 2" 
list[2] = "third token" 

Tabii

bölünmüş olmalıdır aralarında bir virgül olduğu için iki jetona, second token part 1 ve second token part 2'a.

Deseni Python RegEx kullanarak nasıl yapmalıyım?

+0

http://stackoverflow.com/questions/10974932/python-split-string-based-on-regular-expression – Farhadix

+2

@Farhadix, bu bana <> – amphibient

+4

@ kodlu virgüllerin nasıl ekleneceğini söylemez Farhadix Bu sorunun OP'ye nasıl yardımcı olduğunu görmüyorum? –

cevap

9

Güncelleme: parantez belirtti yana iç içe olabilir, Python içinde regex çözüm mümkün olmadığını üzülerek bildiririm aşağıdaki açılı ayraçlar hep dengeli ve asla iç içe ne de kaçan yalnızca, çalışabilir.

>>> import re 
>>> s = "first token, <second token part 1, second token part 2>, third token" 
>>> regex = re.compile(",(?![^<>]*>)") 
>>> regex.split(s) 
['first token', ' <second token part 1, second token part 2>', ' third token'] 
>>> [item.strip(" <>") for item in _] 
['first token', 'second token part 1, second token part 2', 'third token'] 

Regex ,(?![^<>]*>), yalnızca sonraki açılı ayraç, kapanış açılı ayraç değilse, virgüllere ayrılır.

İç içe geçmiş parantezler, bu ya da herhangi bir normal ifade çözümünün Python'da çalışmasını engeller. Ya yinelemeli ifadeleri (Perl veya .NET dilleri gibi) destekleyen bir dil veya bir ayrıştırıcı kullanmanız gerekir.

+0

ümit verici görünüyor. Şimdi test ediliyor ... – amphibient

+0

Normal ifade, "ilk simge", ">", "üçüncü belirteci" ile virgüllerle eşleşir. – sln

+0

@sln: Evet, yazdığım buydu. Regex çözümü iç içe geçmiş etiketleri işleyemez (yuvalama keyfi ise). Ne yazık ki, yuvalama ile ilgili bilgiler sadece cevabımı yazmamdan sonra geldi. –

5
senin örneğin iş görmekte olan bir kludgy yolu <> 'li yıllara "' in tercüme ve sonra bir CSV dosyası olarak tedavi etmektir

:

import csv 
import string 

s = "first token, <second token part 1, second token part 2>, third token"  
a = s.translate(string.maketrans('<>', '""')) 
# first token, "second token part 1, second token part 2", third token 
print next(csv.reader([a], skipinitialspace=True)) 
['first token', 'second token part 1, second token part 2', 'third token'] 
+1

Bu durumun, verilerin başka yerlerinde kullanılmasını yasakladığını belirtmek isteyebilirsiniz (veya ele alın). –

+0

@StevenRumbalski, kullanım durum senaryomda – amphibient

+0

kabul edilebilir. Bu, yuvalanmış köşeli parantezlerle çalışmayacaktır. Yukarıdaki yorumlar iç içe olabileceğini göstermektedir. –

İlgili konular