2014-10-29 25 views
7

Ben ürün virgül ile ayrılır, aynı zamanda içerik parantez öğelerin içinde virgül olabilir nerede bu gibi bir dize olduğunu varsayalım:Parantez içinde olmayan virgüller nasıl bölünür?

(Düzeltme: Üzgünüm, bazı öğeleri Parantez içeriğe sahip olmayabilir belirtmeyi unutmuşum)

"Water, Titanium Dioxide (CI 77897), Black 2 (CI 77266), Iron Oxides (CI 77491, 77492, 77499), Ultramarines (CI 77007)" 

Dizeyi yalnızca parantez içinde olmayanlar tarafından nasıl bölebilirim? yani:

["Water", "Titanium Dioxide (CI 77897)", "Black 2 (CI 77266)", "Iron Oxides (CI 77491, 77492, 77499)", "Ultramarines (CI 77007)"] 

Ben bir regex, böyle belki bir şey kullanmak zorunda düşünüyorum:

([(]?)(.*?)([)]?)(,|$) 

ama hala o iş yapmaya çalışıyorum.

+1

Eğer şimdiye kadar teşebbüs ne gösterebilir? –

cevap

10
: Ben parantez olmadan içeriği kabul regex dize modifiye

Parantez içinde olmayan tüm virgülleri eşleştirmek için negative lookahead kullanın. Giriş dizgisini eşleşen virgüllere göre bölmek, istediğiniz çıktıyı verecektir.

,\s*(?![^()]*\)) 

DEMO

>>> import re 
>>> s = "Water, Titanium Dioxide (CI 77897), Black 2 (CI 77266), Iron Oxides (CI 77491, 77492, 77499), Ultramarines (CI 77007)" 
>>> re.split(r',\s*(?![^()]*\))', s) 
['Water', 'Titanium Dioxide (CI 77897)', 'Black 2 (CI 77266)', 'Iron Oxides (CI 77491, 77492, 77499)', 'Ultramarines (CI 77007)'] 
0

Regex

[^()]*\([^()]*\),? 

kodu deneyin:

>>x="Titanium Dioxide (CI 77897), Black 2 (CI 77266), Iron Oxides (CI 77491, 77492, 77499), Ultramarines (CI 77007)" 
>> re.findall("[^()]*\([^()]*\),?",x) 
['Titanium Dioxide (CI 77897),', ' Black 2 (CI 77266),', ' Iron Oxides (CI 77491, 77492, 77499),', ' Ultramarines (CI 77007)'] 

regex sadece o str.replace ve str.split kullanarak yapabilirsiniz http://regex101.com/r/pS9oV3/1

2

nasıl çalıştığını görmek. ),'u değiştirmek için herhangi bir karakter kullanabilirsiniz.

a = "Titanium Dioxide (CI 77897), Black 2 (CI 77266), Iron Oxides (CI 77491, 77492, 77499), Ultramarines (CI 77007)" 
a = a.replace('),', ')//').split('//') 
print a 

çıkışı: - regex kullanma

['Titanium Dioxide (CI 77897)', ' Black 2 (CI 77266)', ' Iron Oxides (CI 77491, 77492, 77499)', ' Ultramarines (CI 77007)'] 
+0

"Su" dizesi nerede? –

+0

@AvinashRaj ohh! Sadece dizimde özledim. –

0

, bu findall fonksiyonu ile kolayca yapılabilir.

import re 
s = "Titanium Dioxide (CI 77897), Black 2 (CI 77266), Iron Oxides (CI 77491, 77492, 77499), Ultramarines (CI 77007)" 
re.findall(r"\w.*?\(.*?\)", s) # returns what you want 

kullanın http://www.regexr.com/ burada daha iyi regex anlamak ve isterseniz piton belgelerine link: https://docs.python.org/2/library/re.html

DÜZENLEME: \w[^,(]*(?:\(.*?\))?

İlgili konular