2008-09-22 157 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的正则表达式一样。

相关问题