我在为以下格式编写正则表达式时感到震惊xxxxxx g0-XXXX-XXXX-1923-785FEABCD128上面的格式是过滤MAC地址,所以我需要那些MAC地址,它有上面格式和长度中定义的字符
有可能为上述格式编写regexp吗?X个字符可以是字母数字。但其他非X字符应该是相同的。
ABCDEFG0-GHYD-SDER-1923-785FEABCD128 - Valid
ABCDEFH0-GHYD-SDER-0923-995FEABCD120 - Invalid
ABCDEFG0-GHYD-SDER-0923-995FEABCD120 - Invalid
^[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
与该文本完全匹配
$
匹配字符串的末尾
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
为了字符串匹配而不是正则表达式,您可以使用以下解决方案:
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
这里的好处是什么?如果您需要更改条件或添加新条件,则不需要修改/跟上regex