Python Regex против PHP Regex - PullRequest
       13

Python Regex против PHP Regex

3 голосов
/ 23 сентября 2008

Не соревнование, а я пытаюсь выяснить, почему определенное регулярное выражение работает в одном, а не в другом.

(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]?)

Это мой Regex, и я пытаюсь запустить его на

127.255.0.0

Используя Pythons regex, я ничего не получаю, используя PHP, который мне соответствует, ниже приведены два вызова, которые я делаю (только если это как-то связано с этим). По сути, я пытаюсь понять, почему он работает на PHP, а не на Python.

re.findall(regex, string)
preg_match_all($regex, $string, $matches);


Решение найдено, это было из-за способа, которым я перебирал результаты, это регулярное выражение превращало их в группы, а затем он не хотел распечатывать их одинаково и т. Д. И т. Д. Спасибо всем за помощь, это действительно оценены.

Ответы [ 6 ]

7 голосов
/ 23 сентября 2008

Это работает для меня. Вы, должно быть, делаете что-то не так.

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

4 голосов
/ 23 сентября 2008

Я бы предположил, что использование регулярного выражения для проверки десятичного диапазона не обязательно является правильным ответом для этой проблемы. Это гораздо более читабельно:

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 голосов
/ 14 октября 2008

То, что вы можете делать это с помощью регулярных выражений, не означает, что вы должны это делать. Было бы намного лучше написать такие инструкции, как: разбить строку на период, убедиться, что каждая группа числовая и находится в определенном диапазоне чисел.

Если вы хотите использовать регулярное выражение, просто убедитесь, что оно «похоже» на IP-адрес, как в случае с регулярным выражением Грега.

2 голосов
/ 23 сентября 2008

Без дальнейших подробностей, я бы предположил, что это какая-то цитата. И 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 голос
/ 23 сентября 2008

PHP использует 3 различных вида регулярных выражений, в то время как python использует только один. Я не пишу код на python, поэтому я не претендую на то, чтобы он использовал REGEX. О'Рейли Освоение регулярных выражений - отличная книга, как и большинство их работ.

1 голос
/ 23 сентября 2008

Это регулярное выражение здесь подходит, понятия не имеете, что вы делаете неправильно:

>>> 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 полезен для лексинга, потому что он привязан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...