我在正則表達式之後解析IP地址並提取它們的主機,端口,用戶名和密碼。正則表達式來解析IP
這裏是格式,我感興趣的是:
- 12.34.56.789
- http://12.34.56.789:80
- http://12.34.56.789
- 12.34.56.789:80
- http://login:[email protected]:80
我在正則表達式之後解析IP地址並提取它們的主機,端口,用戶名和密碼。正則表達式來解析IP
這裏是格式,我感興趣的是:
您可以用(蟒蛇)開始:
import re
pattern = "((?P<login>\w+):(?P<password>\w+)@)?(?P<ip>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})(:(?P<port>\d+))?"
re.match(pattern, "12.34.56.789").groupdict()
re.match(pattern, "12.34.56.789:80").groupdict()
re.match(pattern, "john:[email protected]:80").groupdict()
而且很明顯,你所指定的IP無效(馬特說...)
不錯,命名的屬性可以更容易地與 – hoju 2010-11-03 21:59:35
Regexlib將是一個有用的資源,爲您的問題。你可以找到很多解決方案(可能你需要結合一些)
這樣做的比賽可能不是一個最佳做法。插入某種類型的代碼可能更好,它可以執行通用的URI解析。如果您的需求有限,並且可以對您的代碼進行徹底評論/記錄,如果您需要更多的代碼,那麼沿着這條路走下去也許是有道理的。
最簡單的方法是,以匹配四組1至3的數字,以:
喜歡的東西:
([^:]+:[^@][email protected])?(\d{1,3}\.){3}\d{1,3}(:\d{1,5})?
但這將接受愚蠢的東西,像「999.999.999.999:99999」
如果你只希望接受有效的IP地址,並不在意,這恰好是一個URI的一部分,或者不小心在字符串中存在什麼其他垃圾這裏是一個例子:
http://www.regular-expressions.info/examples.html
它基本上匹配四套:
應該讓你開始那。
還有其他基於範圍的匹配IP地址的規則,你可能想要避免(例如0.0.0.0 ,以及保留的範圍),但可能會更容易做後續的匹配。
基本上,我建議你使用非常簡單的例子,或插入一個庫。
嘗試是這樣的
(http://(\w+:\[email protected])?)?(\d{1,3}\.){3}\d{1,3}(:\d{1,5})?
說明:
(http://(\w+:\[email protected])?)? - optional group of http:// followed by optional user:[email protected]
(\d{1,3}\.){3} - three groups of one to three digits followed by a dot
\d{1,3} - one to three digits
(:\d{1,5})? - optional group of colon followed by one to five digits
一起工作,如果你指定ip是(1-255)中的一個數字,不是由0開始並且大於255,那麼它會好得多。 – jargalan 2010-11-03 08:47:00
是的,它不是很健壯。請參閱Merlyn提供的鏈接,瞭解如何根據需要只允許某些數字組合的一些示例。 – 2010-11-03 08:59:55
+1,我在我的答案(我自己計算出來)中有很好的這個實現,但我通過比較這個答案來「調試」它)(我有用戶名:password @ syntax backwards,lol )。儘管如此,這個更好 - 我更喜歡\ w,而我沒有可選的http://。解釋也更清晰。 – 2010-11-03 09:12:07
這裏是一個小腳本,在Perl颳起了一陣,做以下的事情 a)檢查與角色 B中前場首發)驗證IP地址 三)驗證口後,剔除了用戶名和密碼
#!/usr/bin/perl
while (<>) {
chomp;
if (/(?:(?:([a-zA-z]\w+)\:(\w+))@)?((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}))(?:\:(\d{1,5}))?/) {
print "username=$1\n";
print "password=$2\n";
print "ip address=$3\n";
print "port=$8\n";
print "Warning: IP Address invalid\n" if ($4>255||$5>255||$6>255||$7>255);
print "Warning: Port Address invalid\n" if ($8>65535);
}
}
編輯:從tchrist建議如下
的比賽完全有效的IP地址使用
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}
代替
([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\.([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])){3}
因爲許多正則表達式引擎匹配在第一種可能性或序列
你可以試試你的正則表達式引擎:10.48.0.200
通過'http:// ...'是不是IP地址,但是一個URI。 – Gumbo 2010-11-03 08:12:08
789不是有效的八位字節。另外:你到目前爲止嘗試過什麼? – 2010-11-03 08:19:45
你在用什麼語言?有機會有比編寫自己的正則表達式更好的解決方案 – Gareth 2010-11-03 08:28:15