Регулярное выражение Python для строки с необязательной частью в Django RegexField

#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 )?$'