#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
Какая здесь выгода? Если вам нужно изменить условия или добавить новое условие, вам не нужно изменять/поддерживать регулярное выражение