2011-06-22 16 views
2

我遇到了這個正則表達式的問題,我想我快到了。正則表達式返回所有字符,直到「/」向後搜索

m =re.findall('[a-z]{6}\.[a-z]{3}\.[a-z]{2} (?=\" target)', 'http://domain.com.uy " target') 

這給了我想要的「精確」輸出。即domain.com.uy,但顯然這只是一個例子,因爲[a-z]{6}只是匹配前6個字符,這不是我想要的。

我希望它返回domain.com.uy所以基本上指令將是匹配任何字符,直到遇到「/」(向後)。

編輯:

m =re.findall('\w+\.[a-z]{3}\.[a-z]{2} (?=\" target)', 'http://domain.com.uy " target') 

是非常接近我想要什麼,但不會匹配 「_」 或 「 - 」。

爲了完整起見,我做需要http://

我希望這個問題是非常明顯的,如果我離開任何公開的解釋請詢問需要澄清!

提前致謝!

+0

參見:http://www.codinghorror.com/blog/2008/ 06/regular-expressions-now-you-have-two-problems.html – Johnsyweb

回答

1

另一種選擇是使用positive lookbehind(?<=//)

>>> re.search(r'(?<=//).+(?= \" target)', 
...   'http://domain.com.uy " target').group(0) 
'domain.com.uy' 

注意,這將匹配URL本身內斜線,如果這是需要的:

>>> re.search(r'(?<=//).+(?= \" target)', 
...   'http://example.com/path/to/whatever " target').group(0) 
'example.com/path/to/whatever' 

如果你只是想裸域,沒有任何路徑或查詢參數,您可以使用r'(?<=//)([^/]+)(/.*)?(?= \" target)'和捕獲組1:

>>> re.search(r'(?<=//)([^/]+)(/.*)?(?= \" target)', 
...   'http://example.com/path/to/whatever " target').groups() 
('example.com', '/path/to/whatever') 
+0

第一個正是我想要的!非常感謝,我清楚地使用了一種非常奇怪的方法!謝謝! +1 – Trufa

0

試試這個(也許你需要逃避/在Python):

/([^/]*)$ 
+0

這也會捕獲不需要的斜槓。 :> – Leif

+0

也許我在做一些愚蠢的東西,我並不擅長用正則表達式,它們讓我花了很多時間,你的意思是這樣'm = re.findall('/([^ /] *)$ [az ] \。[az] {3} \。[az] {2}(?= \「target)','http://domain.com.uy」target') '因爲它不起作用。 – Trufa

+0

@Leif它不會抓住斜線,如果沒有斜線,它就不會工作。我同意你可以刪除它。 – Thresh

0

它是如此簡單:

[^/]+(?= " target) 

但要知道,http://domain.com/folder/site.php不會返回域。 並記住要正確地在字符串中逃避正則表達式。

+0

對不起,我對於正則表達式並不是很擅長,請花費我很多時間來理解你的意思? 'm = re.findall('[^ /] + $ [az] \。[az] {3} \。[az] {2}(?= \「target)','http://domain.com .uy「target」) '因爲它不工作。 – Trufa

+0

對不起,誤會。糾正這一點。你必須使用我的整個正則表達式順便說一句。 – Leif

1

如果不需要正則表達式,並且您只是想從Python中的URL中提取FQDN。使用urlparsestr.split()

>>> from urlparse import urlparse 
>>> url = 'http://domain.com.uy " target' 
>>> urlparse(url) 
ParseResult(scheme='http', netloc='domain.com.uy " target', path='', params='', query='', fragment='') 

這已經打破了URL到它的組成部分。我們希望netloc:在空白

>>> urlparse(url).netloc 
'domain.com.uy " target' 

斯普利特:

>>> urlparse(url).netloc.split() 
['domain.com.uy', '"', 'target'] 

只是第一部分:

>>> urlparse(url).netloc.split()[0] 
'domain.com.uy' 
+0

我會給這個看看,正則表達式絕對不會被重新查詢,我只是在這種情況下它可能是一個不錯的選擇。 – Trufa

+2

每當在同一個句子中使用regexp和url時,它通常聽起來像一個糟糕的主意。 +1 – yarian

+1

詢問你真正想知道的事情 - 不是「我如何讓技術X工作來解決問題Y?」,而是「我該如何解決問題Y?」。 –

相關問題