Python Regex vs PHP Regex

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

(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, я ничего не получаю, используя PHP, который я ему сопоставляю, ниже приведены два звонка, которые я делаю (просто сделайте так, как будто это что-то с этим связано). По сути, я пытаюсь понять, почему он работает на PHP, но не Python.

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


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

Related of "Python Regex vs PHP Regex"

Меня устраивает. Вы, должно быть, делаете что-то неправильно.

 >>> 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-адрес», как с регулярным выражением Грега.

Без дальнейших подробностей я бы предположил, что это цитата из какого-то рода. Как PHP, так и объекты Regex для python берут строки в качестве аргументов. Эти строки будут экранированы, прежде чем они будут переданы на двигатель 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]?)' 

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

 >>> 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 переводит на re.search в Python, а не на re.match . re.match полезен для lexing, потому что он привязан.

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