#python #regex #django
#python #регулярное выражение #django
Вопрос:
Я пытаюсь получить правильное регулярное выражение. Я хочу сопоставить строки типа ‘pci0000_00_0b_0’ и ‘bus1port1’ с необязательным ‘-[somedigit]’, например pci0000_00_0b_0-4 или bus1port1-0.
Вот регулярное выражение:
device_re = re.compile(r'(pci[0-9a-f]{4}_[0-9a-f]{2}_[0-9a-f]{2}_[0-9a-f]{1}(-d )?)|(busd portd (-d )?)')
К сожалению, когда я создаю поле Django, унаследованное от RegexField:
forms.RegexField.__init__(self, device_re,
max_length, min_length, *args, **kwargs)
к сожалению, оно также соответствует pci0000_00_0b-неважно, pci0000_00_0b что угодно …
Кроме того, кто-нибудь может дать мне советы о том, как RegexField использует данное регулярное выражение?
Комментарии:
1. является ли эта часть
pci0000_00_0b_0
обязательной, если да, то вы удаляете последнюю_0
в вашем примере?2. Я забыл об этом ‘_0’ . исправлено. Эта часть обязательна
Ответ №1:
Приведенное ниже регулярное выражение сделало бы последнюю -d
часть необязательной.
^(?:pci[0-9a-f]{4}_[0-9a-f]{2}_[0-9a-f]{2}_[0-9a-f]{1}|busd portd )(?:-d )?$
Если вам нужна только одна цифра после -
, то удалите
метку из d
в необязательной части.
^(?:pci[0-9a-f]{4}_[0-9a-f]{2}_[0-9a-f]{2}_[0-9a-f]{1}|busd portd )(?:-d)?$
Комментарии:
1. Оно по-прежнему частично совпадает с ‘pci0000_00_0b_0-c’ в примере, в результате чего RegexField в Django утверждает, что это значение является допустимым. Но если я добавлю ^ в начале и $ в конце, это сработает правильно. итак, эта версия работает так, как ожидалось:
r'^(?:pci[0-9a-f]{4}_[0-9a-f]{2}_[0-9a-f]{2}_[0-9a-f]{1}|busd portd )(?:-d )?$'