代码之家  ›  专栏  ›  技术社区  ›  Derek Kwon

正则表达式:匹配字符串而不考虑空格

  •  -1
  • Derek Kwon  · 技术社区  · 1 年前

    我正在创建一个正则表达式,用于以两种格式匹配车牌号:{1到9之间的数字}-{5个大写字母或数字},或{2位数的数字}-{4个大写字母和数字}。

    我使用以下正则表达式模式: ^\s*[1-9]-[A-Z1-9]{5}|[1-9][0-9]-[A-Z1-9]{4}\s*$ 。它匹配的一些示例是: 45-Y21A , 3-78UTW 67-AASE

    我目前的问题是,正则表达式将不匹配带有尾随空格的车牌号,例如, 5-37D8F 。我想 \s* 会解决的,但由于某种原因,它似乎不起作用。

    正则表达式与前导空格匹配得很好,所以我不明白为什么它在尾部空格方面有问题。

    0 回复  |  直到 1 年前
        1
  •  2
  •   Andreas Violaris    1 年前

    我不知道你为什么要将车牌号与其前导空格和尾随空格匹配(如果我正确理解任务的话),而不是车牌号本身,但至少在大多数情况下,你的模式似乎与前导空格或尾随空格都不匹配。

    然而,以下模式似乎可以完成这项工作:

    ^\s*(?:\d-[A-Z1-9]{5}|\d{2}-[A-Z1-9]{4})\s*$
    

    如以下试验所示:

    import re
    
    your_pattern = r"^\s*[1-9][-][A-Z1-9]{5}|([1-9][0-9])[-][A-Z1-9]{4}\s*$"
    my_pattern = r"^\s*(?:\d-[A-Z1-9]{5}|\d{2}-[A-Z1-9]{4})\s*$"
    
    license_plate_numbers = [
        "45-Y21A",
        "3-78UTW",
        "  67-AASE",
        "5-37D8F",
        "5-37D8F   ",
        " 5-37D8F ",
    ]
    
    for license_plate_number in license_plate_numbers:
        match1 = re.match(your_pattern, license_plate_number)
        match2 = re.match(my_pattern, license_plate_number)
    
        print(f"License plate number: '{license_plate_number}'")
    
        if match1:
            print(f"Your pattern matches: '{match1.group(0)}'")
        else:
            print("Your pattern does not match anything")
    
        if match2:
            print(f"My pattern matches: '{match2.group(0)}'")
        else:
            print("My pattern does not match anything")
    
        print()
    
    

    输出:

    License plate number: '45-Y21A'
    Your pattern matches: '45-Y21A'
    My pattern matches: '45-Y21A'
    
    License plate number: '3-78UTW'
    Your pattern matches: '3-78UTW'
    My pattern matches: '3-78UTW'
    
    License plate number: '  67-AASE'
    Your pattern does not match anything
    My pattern matches: '  67-AASE'
    
    License plate number: '5-37D8F'
    Your pattern matches: '5-37D8F'
    My pattern matches: '5-37D8F'
    
    License plate number: '5-37D8F   '
    Your pattern matches: '5-37D8F'
    My pattern matches: '5-37D8F   '
    
    License plate number: ' 5-37D8F '
    Your pattern matches: ' 5-37D8F'
    My pattern matches: ' 5-37D8F '