2008-09-22 211 views
3

不是競爭,而是我試圖找出某個正則表達式爲什麼在一個正則表達式中起作用,而不是另一個。Python正則表達式vs PHP正則表達式

(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]?)\.(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]?) 

這是我的正則表達式,我試圖在

127.255.0.0 

使用Python的正則表達式我什麼也得不到運行它,使用PHP我與之相匹配的,下面是兩個電話我作出(只是櫃面這與此有關)。基本上我正在努力解決它爲什麼在PHP中工作,但不是Python。

re.findall(regex, string) 
preg_match_all($regex, $string, $matches); 


發現的解決方案,這是由於我是通過迭代結果的方式,此正則表達式把它們成組,然後將它不想打印出來以同樣的方式等等等等。謝謝大家的幫助,非常感謝。

+0

在做正則表達式時,使用好的工具總是讓事情變得更容易。這2個在線測試人員應該讓您輸入相同的輸入並進行比較:PHP正則表達式(http://regex.larsolavtorvik.com/)和Python正則表達式(http://ksamuel.pythonanywhere.com)。 – 2012-01-28 15:01:44

回答

7

它適合我。你一定在做錯事。

>>> re.match(r'(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]?)\.(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]?)', '127.255.0.0').groups() 
('127', '255', '0', '0') 

不要忘記使用原始字符串正則表達式來逃避:r'regex_here'作爲Regex Howto

1

這正則表達式匹配在這裏,表示不知道你在做什麼錯:

>>> import re 
>>> x = re.compile(r'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|' 
... r'2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]' 
... r'[0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)') 
>>> x.match("127.0.0.1") 
<_sre.SRE_Match object at 0x5a8860> 
>>> x.match("127.255.0.1") 
<_sre.SRE_Match object at 0x5a8910> 
>>> x.match("127.255.0.0") 
<_sre.SRE_Match object at 0x5a8860> 

請注意,preg_match在Python中轉換爲re.search,而不是re.matchre.match對於lexing很有用,因爲它是錨定的。

1

PHP使用3種不同的正則表達式,而python只使用一種。我不使用python編寫代碼,所以我沒有對它如何使用REGEX提出專家聲明。 O'Reilly Mastering Regular Expressions是一本很棒的書,因爲他們大部分的作品都是。

4

我會建議使用正則表達式進行小數範圍驗證並不一定是此問題的正確答案。這是更可讀:

def valid_ip(s): 
    m = re.match(r"(\d+)\.(\d+)\.(\d+)\.(\d+)$", s) 
    if m is None: 
     return False 
    parts = [int(m.group(1+x)) for x in range(4)] 
    if max(parts) > 255: 
     return False 
    return True 
2

沒有進一步的細節,我想這是引用轉義的某種。 PHP和Python的RegEX對象都以字符串作爲參數。在傳遞給RegEx引擎之前,這些字符串將被languge轉義。

使用正則表達式時,我總是使用Python的「原始」字符串格式。它確保「backslashes are not handled in any special way

r'(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]?)\.(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

僅僅因爲你可以用正則表達式做到這一點,並不意味着你應該。寫下這樣的指令會更好:在句點上分割字符串,確保每個組都是數字,並且在一定的數字範圍內。

如果您想使用正則表達式,只需驗證它的類似於「看起來像」的IP地址,就像Greg的正則表達式一樣。

相關問題