2013-08-31 58 views
0

我需要匹配這兩種格式,如:user:[email protected]:3847111.23.123.78:2938,你怎麼做(匹配有效代理只有)?如何完美匹配代理與正則表達式?

順便說一下,python中是否有這樣的模塊(驗證代理格式)?

+0

它們都是URL,沒有方案部分。我會查看['urlparse'模塊](http://docs.python.org/2/library/urlparse.html)進行驗證。 –

+0

至於將這些格式與正則表達式匹配,您應該能夠簡化現有的URL匹配表達式;沒有路徑部分需要,也沒有計劃。 –

回答

0

我不確定在Python中是否存在用於驗證的包。

但是,你可以使用這個表達式,正確的格式相匹配,但不會驗證如果IP是一個有效的IP4地址:

^(?:(\w+)(?::(\w+))[email protected])?((?:\d{1,3})(?:\.\d{1,3}){3})(?::(\d{1,5}))?$ 

它也將捕獲用戶名,密碼,IP和端口分別

陽性:如果IP4解決了

user:[email protected]:3847 
[email protected]:3847 
10.10.0.1:1024 
111.23.123.78:2938 
10.124.0.1 
0.0.0.0 

正則表達式將無法識別重新有效:

10.20.456.123 

底片:

10.100.1 
:[email protected] 
user:@10.100.1.0:100 

正則表達式進行測試http://www.rubular.com/r/jErO9xqDS2

+0

嗯,這不是一個簡單的3位數字,而上限是255.如何讓它識別這個? – Shane

+0

正如我所說,它沒有驗證。你肯定不想在一個正則表達式中做所有事情,以保持它的可維護性。您可以通過第二遍驗證其符合IP4標準。將IP地址拆分爲\。並驗證每個值在0到255之間。您還需要使用相同的技術確保端口在1到65535的範圍內。 –

+0

哦,我看到了,感謝隊友 – Shane

0

隨着驗證:

import re 

samples = [ 
    'user:[email protected]:1234', 
    '123.123.123.123:1234', 
    '123.123.123:123', 
    '321.123.123.123', 
    '123.123.123.123:123123'] 

def isValidUser(name): 
    return re.match('\w+', name) != None 

def isValidPass(passwd): 
    return isValidUser(passwd) 

def isValidIp(ip): 
    if ip.count('.') != 3: 
     return False 
    else: 
     valid = True 
     for i in ip.split('.'): 
      try: 
       if 0 <= int(i) <= 255: 
        pass 
       else: 
        valid = False 
      except ValueError: 
       return False 
     return valid 

def isValidPort(port): 
    valid = False 
    try: 
     if 0 < int(port) < 2**16: 
      valid = True 
    except ValueError: 
     return False 
    return valid 

def isValidProxy(proxy): 
    m = re.match('^((([^:]+):([^@]+))@)?((\d{1,3}\.){3}\d{1,3})(:(\d{1,5}))?$', proxy) 
    if m is None: 
     return False 
    user = m.group(3) or 'user' 
    passwd = m.group(4) or 'pass' 
    ip = m.group(5) 
    port = m.group(8) or '1234' 

    return isValidUser(user) and isValidPass(passwd) and isValidIp(ip) and isValidPort(port) 

for n in samples: 
    print isValidProxy(n) 

我假定口是可選的。如果您需要更改端口:

port = m.group(8) or '1234' 

port = m.group(8) 

和/或改變:

m = re.match('^((([^:]+):([^@]+))@)?((\d{1,3}\.){3}\d{1,3})(:(\d{1,5}))?$', proxy) 

m = re.match('^((([^:]+):([^@]+))@)?((\d{1,3}\.){3}\d{1,3})(:(\d{1,5}))$', proxy) 
+0

該代碼會將999.999.999.999:999視爲有效的IP地址,而上限應爲255 ... – Shane

+0

重複使用現有的代碼,然後您應對主機名稱而不是IP地址和IP地址格式的變化。 – tripleee

0

編輯: 使用google-url (GURL) C++庫來解析和驗證網址。 There是Python包裝。

+0

你能否提一下你喜歡urlparse的理由? –

+0

@pxl:太糟糕了,它只解析但不驗證... – Shane