2016-01-17 12 views
6

veriliyor - Python:Python - bir alt ayıklamak için en zarif şekilde, bir dize var sağ ve sol sınırları

string = "/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/" 

Beklenen çıktısı:

"Atlantis-GPS-coordinates" 

biliyorum beklenen çıkışı DAİMA sağda solda "/ bar /" ve "/" ile çevrilidir:

"/bar/Atlantis-GPS-coordinates/" 

Önerilen çözüm gibi görünecektir:

a = string.find("/bar/") 
b = string.find("/",a+5) 
output=string[a+5,b] 

Bu işe yarar, ama ben bundan hoşlanmıyorum. Birisi güzel bir işlev veya ipucu biliyor mu?

+0

'string.split ("/ bar /") [1] .split ("/") [0]' – dawg

cevap

7

Sen split kullanabilirsiniz: partition

>>> string.split("/bar/", 1)[1].split("/", 1)[0] 
'Atlantis-GPS-coordinates' 

Veya kullanmak:

>>> string.split("/bar/")[1].split("/")[0] 
'Atlantis-GPS-coordinates' 

Bazı verimlilik 1 bir maksimum bölünmüş eklemesini herhalde

>>> string.partition("/bar/")[2].partition("/")[0] 
'Atlantis-GPS-coordinates' 

Ya regex:

>>> re.search(r'/bar/([^/]+)', string).group(1) 
'Atlantis-GPS-coordinates' 

sizin ve verilerden bahsedilmektedir bağlı.

+0

cevabınızı seviyorum. Doğrulayacağım. Bölünmüş ve bölünmenin avantajları/dezavantajları nelerdir? – Vincent

+0

Ana fark,/bar/'mevcut değilse, her birinin bölünmeyi nasıl işlediğidir. 'bölüm' her zaman bölüm elemanının boş dizeleri bulunan üç elemanlı bir tuple üretir. 'split', üretilen listedeki elemanların sayısını değiştirir. Bölümün yapması gereken şeyi yapıp yapmadığını test etmek daha kolay.Dize başarılı bir şekilde bölüneceğini bilseydim, 'split' kullanırdım; test etmek gerekirse 'bölüm' veya bir regex. – dawg

3

Ne yapmadın o kadar da kötü değil. sürece /bar/WHAT-YOU-WANT/ daima mevcut olacak biliyorum olarak

start = string.find('/bar/') + 5 
end = string.find('/', start) 
output = string[start:end] 

: Ben yazacağınız. Aksi takdirde, ben regular expression knife için ulaşacağını: (diğer çözümlere göre daha yavaş) re kullanma

>>> import re 
>>> PATTERN = re.compile('^.*/bar/([^/]*)/.*$') 
>>> s = '/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/' 
>>> match = PATTERN.match(s) 
>>> match.group(1) 
'Atlantis-GPS-coordinates' 
+0

Regex grubunuzda, –

+0

@MartinKonecny ​​adlı bir parantez eksik. Teşekkürler –

0

: Python 2.x örneğidir

>>> import re 
>>> string = "/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/" 
>>> re.search(r'(?<=/bar/)[^/]+(?=/)', string).group() 
'Atlantis-GPS-coordinates' 
1
import re 

pattern = '(?<=/bar/).+?/' 
string = "/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/" 

result = re.search(pattern, string) 
print string[result.start():result.end() - 1] 
# "Atlantis-GPS-coordinates" 

. Öncelikle: 1. (? < =/bar /), yalnızca önceliği varsa aşağıdaki normal ifadeyi işler (böylece/bar/ondan önce olmalıdır) 2. '. +? /' Herhangi bir miktar anlamına gelir. karakterlerin kadar bazı yardımcı olur sonraki '/' Char

Umut dek.

bunu daha iyidir bir demet arama bu tür yapmak gerekirse performans için bu aramayı 'derleme', ama sadece bunu yapmak gerekirse bir kez rahatsız etmeyin.

İlgili konular