Не конкуренция, вместо этого я пытаюсь найти, почему определенное регулярное выражение работает в одном, но не в другом.
(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);
Меня устраивает. Вы, должно быть, делаете что-то неправильно.
>>> 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 – отличная книга, так как большинство их работ.