2017-03-27 16 views
1

我正在編寫一個Python代碼,用於處理一段文本,其中的文本對我來說無用,其中包含網址。在文本塊之外,我只需要域,而不是完整的URL。例如輸入:如何僅將URL的域部分與正則表達式匹配?

47.91.158.176 or 54.145.185.110 port 80 - gooolgeremf.top - GET /search.php 
47.90.205.113 or 35.187.59.173 port 80 - voperforseanx.top/site/chrome_update.html 

所以我在這裏只需要gooolgeremf.topvoperforseanx.top匹配,但我寫的正則表達式也將匹配search.phpchrome_update.html

我在想,正則表達式應該在/之後停止匹配。但是我不知道如何實現它,特別是如何防止整個文本文件中的第一個/之後出現的匹配域。

它至今工作在我的代碼的方式:

regexdm="[A-Za-z0-9]{1,}\.[A-Za-z0-9]{1,10}\.?[A-Za-z]{1,}\.?[A-Za-z]{1,}" 
dmsc=re.findall(regexdm, iocsd.read()) 
+0

你的意思是FQDN /主機名,還是隻有域名? – mootmoot

回答

2

我建議添加分隔符條件。提供域名可以用空格只包圍,開始線/結束和兩個正域之前削減和之後一個斜線,正則表達式是:

(?: |//|^)([A-Za-z0-9]{1,}\.[A-Za-z0-9]{1,10}\.?[A-Za-z]{1,}\.?[A-Za-z]{1,})(?: |/|$) 

演示:https://regex101.com/r/TQKlDP/1

+0

在某些情況下,如test.uk沒有工作! – RaminNietzsche

+1

RaminNietzsche:這是因爲原始正則表達式不允許這樣的域名(即TLD中少於三個字母的域名)。我承認看起來域名過濾器過於嚴格甚至是錯誤的,但我在假設這種限制是故意(或至少可以接受)的前提下做出了回答,唯一的問題是將這些域名與文本的其他部分區分開來。 –

1

正則表達式是不這樣做的最簡單的方法,你應該使用urlparse.urlparse

from urlparse import urlparse 
parsed_uri = urlparse('http://voperforseanx.top/site/chrome_update.html') 
print parsed_uri.netloc 

給人

voperforseanx.top 

但是,f或參考,這裏是如何處理與正則表達式的URL:Getting parts of a URL (Regex)

+0

如果您刪除問題輸入中顯示的'http://',netloc將不會顯示該域。返回無。 – nivhanin

0

如果您字符串模式是完全一樣的,你可以這樣做:

str = "47.90.205.113 or 35.187.59.173 port 80 - voperforseanx.top/site/chrome_update.html" 
parsed_uri = str.split()[6].split('/')[0] 

而且你可以得到域。

0

在Python 2.7.13,另一種方法例如(取決於輸入模式):

str = "47.90.205.113 or 35.187.59.173 port 80 - voperforseanx.top/site/chrome_update.html" 
parsed_uri = str.split()[6].split('/')[0] 
print parsed_uri 
>> voperforseanx.top 
0
(\b[\w\.]+\.[a-zA-Z]{2,}\b)(.+)$ 

在此正則表達式的:

(\b[\w\.]+\.[a-zA-Z]{2,}\b) 

部分,將匹配你正在尋找,其餘的是廢品。爲了工作,這個正則表達式需要一個gmi變形者。

+0

什麼是「gmi變性劑」?你有參考嗎? –

+0

http://www.ciaomondo。it/regular-expressions/english-guide.php#flags在本指南中有一個簡單的解釋 – q81