Python正则表达式与PHP正则表达式的比较

3

这不是一场比赛,而是我尝试找出为什么某个正则表达式在一个环境中可以工作,而在另一个环境中却不能。

(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);

找到了解决方案,是由于我遍历结果的方式造成的,这个正则表达式将它们转换为组,然后它不想以相同的方式打印它们等等。感谢大家的帮助,真的非常感激。

在进行正则表达式时,使用一个好的工具总是能让事情变得更容易。这两个在线测试工具应该可以让您输入相同的内容并进行比较:PHP正则表达式(http://regex.larsolavtorvik.com/)和Python正则表达式(http://ksamuel.pythonanywhere.com)。 - Bite code
6个回答

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')

不要忘记使用原始字符串来转义正则表达式:在Regex Howto中所述,使用r'regex_here'

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

3

仅仅因为你可以用正则表达式实现它,并不意味着你应该这样做。更好的方法是编写指示,例如:在句号上分割字符串,确保每个组是数字并且在一定的数字范围内。

如果你想使用正则表达式,只需验证它是否类似于IP地址,就像格雷格的正则表达式一样。


2

没有更多细节,我猜测这可能是某种引用转义。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]?)'

1

PHP使用3种不同的正则表达式,而Python只使用一种。我不会用Python编程,所以我对它如何使用正则表达式没有专业的说法。O'Reilly Mastering Regular Expressions是一本很棒的书,就像他们的大部分作品一样。


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 用于词法分析非常有用,因为它是锚定的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接