Python 3.x 如何用python编写更好的正则表达式?

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

我有两种情况需要匹配。长度应该正好是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-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