不是竞争,而是我试图找出为什么某个正则表达式在一个而不是另一个中起作用。
(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正则表达式我得不到任何东西,使用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'
中所述的Regex Howto
我建议使用正则表达式进行小数范围验证不一定是这个问题的正确答案。这更具可读性:
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
仅仅因为你可以用正则表达式来做,并不意味着你应该这样做。编写如下指令会好得多:在句点上拆分字符串,确保每个组都是数字,并且在一定数量范围内。
如果你想使用一个正则表达式,只需要验证它看起来像一个IP地址,就像Greg的正则表达式一样。
没有进一步的细节,我猜它是某种逃避的引用。 PHP和python的RegEX对象都将字符串作为参数。在传递给RegEx引擎之前,这些字符串将被语言转义。
在处理正则表达式时,我总是使用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]?)'
那个正则表达式在这里匹配,不知道你做错了什么:
>>> 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
对lexing有用,因为它是固定的。
PHP使用3种不同口味的正则表达式,而python只使用一种。我不在python中编码,所以我没有就如何使用REGEX做出专家声明。 O'Reilly Mastering Regular Expressions是一本很棒的书,因为他们的大部分作品都是。