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);
解决方案找到了,问题出在我处理结果的方式上,这个正则表达式把结果分成了几个组,然后它不想以同样的方式打印出来等等。非常感谢大家的帮助,我真的很感激。
6 个回答
3
仅仅因为你可以用正则表达式来做某件事,并不意味着你应该这么做。其实,写一些简单的指令会更好,比如:把字符串按句号分开,确保每一部分都是数字,并且在某个特定的范围内。
如果你想用正则表达式,那就只需要确认它大致“看起来”像一个IP地址,就像Greg的正则表达式那样。
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
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'
,就像在正则表达式使用指南里说的那样。