Python 3.x 如何用python编写更好的正则表达式?
我有两种情况需要匹配。长度应该正好是16。 第一种情况下,模式应包含Python 3.x 如何用python编写更好的正则表达式?,python-3.x,Python 3.x,我有两种情况需要匹配。长度应该正好是16。 第一种情况下,模式应包含A-F、A-F、0-9和'-' AC-DE-48-23-45-67-AB-CD ACDE48234567ABCD 我试过使用r'^([0-9A-Fa-f]{16})$|([0-9A-Fa-f]{2}-){7}[0-9A-Fa-f]{2})$”。寻找更好的表达式。您可以简化正则表达式,方法是将字符串视为一组两个十六进制数字,后跟可选的-,后跟6个类似的组(即,如果第一组有-,则后续的组也必须有),后跟一组两个十六进制数字: ^[0
A-F、A-F、0-9
和'-'
AC-DE-48-23-45-67-AB-CD
ACDE48234567ABCD
我试过使用
r'^([0-9A-Fa-f]{16})$|([0-9A-Fa-f]{2}-){7}[0-9A-Fa-f]{2})$”
。寻找更好的表达式。您可以简化正则表达式,方法是将字符串视为一组两个十六进制数字,后跟可选的-
,后跟6个类似的组(即,如果第一组有-
,则后续的组也必须有),后跟一组两个十六进制数字:
^[0-9A-Fa-f]{2}(-?)([0-9A-Fa-f]{2}\1){6}[0-9A-Fa-f]{2}$
使用re.I
标志可以从字符类中删除a-f
:
^[0-9A-F]{2}(-?)([0-9A-F]{2}\1){6}[0-9A-F]{2}$
您还可以在字符类中将0-9
替换为\d
(尽管我个人认为0-9
更容易阅读),从而进一步简化:
python代码示例:
import re
strs = ['AC-DE-48-23-45-67-AB-CD',
'ACDE48234567ABCD',
'AC-DE48-23-45-67-AB-CD',
'ACDE48234567ABC',
'ACDE48234567ABCDE']
for s in strs:
print(s + (' matched' if re.match(r'^[0-9A-F]{2}(-?)([0-9A-F]{2}\1){6}[0-9A-F]{2}$', s, re.I) else ' didn\'t match'))
输出
AC-DE-48-23-45-67-AB-CD matched
ACDE48234567ABCD matched
AC-DE48-23-45-67-AB-CD didn't match
ACDE48234567ABC didn't match
ACDE48234567ABCDE didn't match
如果它运行良好,那么您实际上在寻找什么?在这种情况下,您认为“更好”的是什么?您可以将所有
0-9
替换为\d
。如果您的匹配者可以选择忽略大小写,您可以去掉A-F
或A-F
。在Python中,您可以去掉所有-
字符,然后检查是否与第二种情况匹配。@Bluetooth剥离-
字符将允许类似ABCD-E-F01-23-456789
的内容匹配,我认为这不是OP的意图
AC-DE-48-23-45-67-AB-CD matched
ACDE48234567ABCD matched
AC-DE48-23-45-67-AB-CD didn't match
ACDE48234567ABC didn't match
ACDE48234567ABCDE didn't match