Регулярное выражение для фильтрации MAC-АДРЕСА

#javascript #python #regex #regexp-replace #nsregularexpression

#язык JavaScript #питон #регулярное выражение

Вопрос:

Я поражен написанием регулярного выражения для формата ниже XXXXXXG0-XXXX-XXXX-1923-785FEABCD128 Вышеуказанный формат предназначен для фильтрации MAC-адреса, поэтому мне нужны те MAC-АДРЕСА, которые имеют символы, определенные в указанном выше формате и длине

Можно ли написать регулярное выражение для указанного выше формата? Символы X могут быть буквенно-цифровыми. Но другие символы, отличные от X, должны быть такими же.

 ABCDEFG0-GHYD-SDER-1923-785FEABCD128 - Valid  ABCDEFH0-GHYD-SDER-0923-995FEABCD120 - Invalid  ABCDEFG0-GHYD-SDER-0923-995FEABCD120 - Invalid  

Комментарии:

1. Почему регулярное выражение? Почему нет if address.endswith('1923-785FEABCD128') ?

2. @C. Nivs, там G0 тоже есть «а». Но ваша точка зрения верна: сопоставление строк, вероятно, подходит лучше, чем регулярное выражение здесь.

Ответ №1:

 ^[a-zA-Z0-9]{6}G0-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-1923-785FEABCD128$  

Объяснение:

^ соответствует началу строки

[a-zA-Z0-9]{6} соответствует любому буквенно-цифровому символу 6 раз

G0- точно соответствует этому тексту

[a-zA-Z0-9]{4}- любой буквенно-цифровой символ 4 раза, за которым следует дефис (появляется дважды)

1923-785FEABCD128 точно соответствует этому тексту

$ соответствует концу строки

Ответ №2:

 import re  patt = re.compile('[A-Z0-9]{6}G0-[A-Z0-9]{4}-[A-Z0-9]{4}-1923-785FEABCD128')  for test in ['ABCDEFG0-GHYD-SDER-1923-785FEABCD128', 'ABCDEFH0-GHYD-SDER-0923-995FEABCD120', 'ABCDEFG0-GHYD-SDER-0923-995FEABCD120']:  if patt.match(test):  print(f'{test} - Valid')  else:  print(f'{test} - Invalid')  

С принтами

 ABCDEFG0-GHYD-SDER-1923-785FEABCD128 - Valid ABCDEFH0-GHYD-SDER-0923-995FEABCD120 - Invalid ABCDEFG0-GHYD-SDER-0923-995FEABCD120 - Invalid  

Комментарии:

1. хех, почти такой же ответ, как и @devjoco, за исключением того, что в нем разрешены строчные буквы

Ответ №3:

Для сопоставления строк вместо регулярного выражения вы можете использовать это решение:

 mac_addresses = [  'ABCDEFG0-GHYD-SDER-1923-785FEABCD128',  'ABCDEFH0-GHYD-SDER-0923-995FEABCD120',  'ABCDEFG0-GHYD-SDER-0923-995FEABCD120' ]  for address in mac_addresses:  # splits 3 times, leaving the last two groups together  # for easier string matching  first, *_, last = address.split('-', 3)    if first.endswith('G0') and last == '1923-785FEABCD128':  match = 'Valid'  else:  match = 'Invalid'   print(f"{address} - {match}")  

Какие отпечатки

 ABCDEFG0-GHYD-SDER-1923-785FEABCD128 - Valid ABCDEFH0-GHYD-SDER-0923-995FEABCD120 - Invalid ABCDEFG0-GHYD-SDER-0923-995FEABCD120 - Invalid  

Какая здесь выгода? Если вам нужно изменить условия или добавить новое условие, вам не нужно изменять/поддерживать регулярное выражение