Python正则表达式与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
使用Pythons regex我一无所获,使用PHP我将它匹配,下面是我正在进行的两个调用(以防万一与此有关)。本质上,我试图弄清楚为什么它可以在PHP中工作,但不能在Python中工作。
re.findall(regex, string) preg_match_all($regex, $string, $matches);
找到解决方案,这是由于我遍历结果的方式所致,此正则表达式将它们分成组,然后不想以相同的方式将其打印出来,等等。谢谢大家的帮助,这确实赞赏。
解决方案
这个对我有用。我们一定做错了。
>>> 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'
来转义正则表达式,如正则表达式说明中所述
该正则表达式在这里匹配,不知道我们在做什么错:
>>> 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.match
。因为re-match是锚定的,所以它对词法分析很有用。
PHP使用3种不同形式的regex,而python仅使用一种。我不使用python编写代码,因此我对它使用REGEX的方式没有专家的要求。 O'Reilly掌握正则表达式是一本很棒的书,因为他们的大多数作品都是如此。
我建议使用正则表达式进行十进制范围验证不一定是此问题的正确答案。这更具可读性:
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
如果没有更多细节,我想这是某种形式的引号转义。 PHP和python的RegEX对象都将字符串作为参数。这些字符串在传递给RegEx引擎之前将被语言进行转义。
使用正则表达式时,我始终使用Python的"原始"字符串格式。它确保"不以任何特殊方式处理反斜杠"
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]?)'
仅仅因为我们可以使用正则表达式进行操作,并不意味着我们应该这样做。最好编写如下指令:在句点上分割字符串,确保每个组都是数字并且在一定范围内。
如果要使用正则表达式,只需验证它与IPreg一样,看起来像是IP地址。