2013-10-17 19 views
1

我需要從URL路徑中提取一些文本,但我對Regex知之甚少。使用re模塊在兩個'/'之間獲取數據

import re 

url = '/s/GETTHISDATA/canBeIgnored/canBeIgnored' 
myData = #needs to equal GETTHISDATA 
+6

'url.split(「/」)[2]' –

+0

'url'是一個字符串?如果是這樣的話請把周圍的引號加上 –

+0

你是否總是需要二級目錄? 「GETTHISDATA」與「canBeIoredored」有什麼區別? –

回答

2

看看這個:

>>> import re 
>>> url = '/s/GETTHISDATA/canBeIgnored/canBeIgnored' 
>>> re.findall('(?<=/).*?(?=/)', url) 
['s', 'GETTHISDATA', 'canBeIgnored'] 
>>> re.findall('(?<=/).*?(?=/)', url)[1] 
'GETTHISDATA' 
>>> 

這樣做是捕獲兩個/的之間的零個或多個字符(非貪婪)。爲了更清楚,這裏是一個細分:

(?<=/) # Poisitive look-back assertion to test if text is preceded by a/
.*? # Zero or more non-whitespace characters that are matched non-greedily 
(?=/) # Positive look-ahead assertion to test if text is followed by a/

然而,一個更清潔,非正則表達式的解決辦法是隻各執/

>>> url.split('/') 
['', 's', 'GETTHISDATA', 'canBeIgnored', 'canBeIgnored'] 
>>> url.split('/')[2] 
'GETTHISDATA' 
>>> 

就個人而言,我會使用第二個解決方案。正則表達式在這裏似乎有點矯枉過正。

+0

這(重新解決方案)可能會返回多個結果,例如,如果你有像'/ s/GETTHISDATA/notthis/orthis /'這樣的url ...在這種情況下,你至少會得到兩個結果,儘管正確的結果仍然是第一個...... –

+0

這是一個很好的觀點。我改變了我的代碼結構來捕捉2/2之間的東西。儘管說實話,我只是給了正則表達式解決方案,因爲OP要求正則表達式。我的_real_答案是使用'str.split'。 – iCodez

相關問題