实用正则表达式归纳

根据日常工作、学习经常用到的场景总结归纳如下表所示:

结合小示例如下:

  1. 匹配用户名

    import re
    
    user_names = ['abc123','user_name12','test-123','name@123', 'ab', 'User123']
    
    pattern = re.compile('^[0-9a-z_-]{3,16}$')
    
    for user in user_names:
        if pattern.match(user):
            print('matched: ', user)
        else:
            print('No matched!')
            
    运行结果如下:
    matched:  abc123
    matched:  user_name12
    matched:  test-123
    No matched!
    No matched!
    No matched!
    

    **说明:**这个正则表达式 ^[0-9a-z_-]{3,16}$ 的含义是:匹配长度在 3 到 16 之间的由数字、小写字母、下划线和短横线组成的字符串。

    下面是一些匹配和不匹配的示例:

    • 匹配

      • abc123
      • user_name12
      • test-123
    • 不匹配

      • ab(长度不足)
      • User123(包含大写字母)
      • name@123(包含特殊字符)

    这个正则表达式可用于验证用户注册名、用户名、密码等情况,要求长度在3到16位,并且只包含数字、小写字母、下划线和短横线。

  2. 匹配密码

    import re
    
    
    passwords = ['abc123','admin_12','password-1234','name@123', 'ab', 'Abc123']
    
    pattern = re.compile('^[0-9a-z_-]{6,18}$')
    
    for password in passwords:
        if pattern.match(password):
            print('matched: ', password)
        else:
            print('No matched!')
            
            
    运行结果如下:
    matched:  abc123
    matched:  admin_12
    matched:  password-1234
    No matched!
    No matched!
    No matched!
    

    **说明:**这个正则表达式 ^[a-z0-9_-]{6,18}$ 的含义是:匹配长度在 6 到 18 之间的由小写字母、数字、下划线和短横线组成的字符串。

    以下是一些示例,说明哪些符合该正则表达式,哪些不符合:

    • 匹配

      • abc123
      • admin_12
      • password-1234
    • 不匹配

      • abc(长度不足)
      • Abc123(包含大写字母)
      • name@123(包含特殊字符)

    这个正则表达式适用于验证密码、用户名等情况,要求长度在 6 到 18 位,并且只包含小写字母、数字、下划线和短横线。

  3. 手机号码

    import re
    
    mobile_nums = ['13612345678','+8613912345678','13888888888', '32345678901','+86111223344','1361234']
    
    pattern = re.compile('^(?:\+86)?1[3-9]\d{9}$')
    
    for mobile in mobile_nums:
        if pattern.match(mobile):
            print('matched: ', mobile)
        else:
            print('No matched!')
            
     运行结果如下:
    matched:  13612345678
    matched:  +8613912345678
    matched:  13888888888
    No matched!
    No matched!
    No matched!
    

    **说明:**这个正则表达式 ^(?:\+86)?1[3-9]\d{9}$ 的含义是:匹配中国大陆手机号码,可以带有国家代码 +86 或不带,在国家代码后面紧跟以 1 开头的手机号码,其中第二位为 3 到 9 之间的数字,后面跟着任意 9 个数字字符。

    以下是一些示例,说明哪些符合该正则表达式,哪些不符合:

    • 匹配

      • 13612345678
      • +8613912345678
      • 13888888888
    • 不匹配

      • 32345678901(不是以 1 开头)
      • +86111223344(号段不在 3 到 9 之间)
      • 1361234(长度不足)

    这个正则表达式适用于验证中国大陆手机号码格式,满足指定的要求。

  4. 颜色的十六进制

    import re
    
    colors = ['#ffffff','#123abc','abc','1234567','#12ab','#xyz123']
    
    pattern = re.compile('^#?([a-f0-9]{6}|[a-f0-9]{3})$')
    
    for color in colors:
        if pattern.match(color):
            print('matched: ', color)
        else:
            print('No matched!')
            
    运行结果如下:
    matched:  #ffffff
    matched:  #123abc
    matched:  abc
    No matched!
    No matched!
    No matched!
    

    **说明:**这个正则表达式 ^#?([a-f0-9]{6}|[a-f0-9]{3})$ 的含义是:匹配十六进制颜色代码,可以以 # 开头或不以 # 开头,后面跟着 3 位或者 6 位由 0-9 和 a-f 组成的字符。

    以下是一些示例,说明哪些符合该正则表达式,哪些不符合:

    • 匹配

      • #ffffff
      • #123abc
      • abc
    • 不匹配

      • 1234567(超过 6 位)
      • #12ab(未满足 3 或 6 位)
      • #xyz123(包含非法字符)

    这个正则表达式适用于验证十六进制颜色代码的格式,确保符合指定的长度和字符范围。

  5. 电子邮箱

    import re
    
    emails = ['example123@email.com','user.name123@example.co.uk','user+test@sub.domain.com','invalid.email@domain','email@domain..com','user name@email.com']
    
    pattern = re.compile('\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}')
    
    for email in emails:
        if pattern.match(email):
            print('matched: ', email)
        else:
            print('No matched!')
            
            
    运行结果如下:
    matched:  example123@email.com
    matched:  user.name123@example.co.uk
    matched:  user+test@sub.domain.com
    No matched!
    No matched!
    No matched!
    

    **说明:**这个正则表达式 \w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14} 的含义是匹配标准的邮箱地址格式。下面是一些示例说明:

    • 用户名部分 ``\w[-\w.+]*`:允许包含字母、数字以及一些特殊字符(例如点号、下划线、百分号、加号和减号)。

    • @符号 @:必须包含 @ 符号。

    • 域名部分 [A-Za-z0-9][-A-Za-z0-9]+.:可以包含字母、数字以及连字符和点号(用于子域名)。

    • 顶级域名 [A-Za-z]{2,14}:至少包含两个字母,用于匹配常见的顶级域名(如com、net、org等)。

    • 匹配

      • example123@email.com
      • user.name123@example.co.uk
      • user+test@sub.domain.com
    • 不匹配

      • invalid.email@domain(顶级域名不足两个字符)
      • email@domain..com(连续的点号)
      • user name@email.com(包含空格)

    该正则表达式能够有效匹配常见的邮箱地址格式,确保符合用户名、@符号、域名和顶级域名的标准。

  6. URL

    import re
    
    pattern = re.compile('^(https?:\/\/)?([a-z\d-]+\.)+[a-z]{2,}(\/[\w\d%+\-./]*)*$')
    
    
    url_lst = ['https://www.example.com','http://subdomain.domain.co.uk/page1','https://www.example.com/path/to/page.html''ftp://example.com','https://www.example.com?query=123','http://www.example.invalid']
    
    
    for url in url_lst:
        if pattern.match(url):
            print('matched: ', url)
        else:
            print('No matched!')
            
     运行结果如下:
    matched:  https://www.example.com
    matched:  http://subdomain.domain.co.uk/page1
    No matched!
    No matched!
    matched:  http://www.example.invalid
    

    **说明:**这个正则表达式 ^(https?:\/\/)?([a-z\d-]+\.)+[a-z]{2,}(\/[\w\d%+\-./]*)*$ 用于匹配常见的 URL 格式。以下是一些示例说明:

    • 匹配
      • https://www.example.com
      • http://subdomain.domain.co.uk/page1
      • https://www.example.com/path/to/page.html
    • 不匹配
      • ftp://example.com(不匹配所支持的协议)
      • https://www.example.com?query=123(未考虑查询字符串)

    这个正则表达式能够有效匹配常见的 URL 格式,包括协议、域名、顶级域名和路径部分,但可能需要根据具体需求进一步调整以包含更多可能的情况。

  7. IP地址

    import re
    
    pattern = re.compile('((2[0-4]\d|25[0-5]|[01]?\d\d?)\\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)')
    
    
    ipv4_lst = ['192.168.1.1','255.255.255.0','10.0.0.1','256.168.1.1','192.168.1.','1.1.1']
    
    for ip in ipv4_lst:
        if pattern.match(ip):
            print('matched: ', ip)
        else:
            print('No matched!')
            
            
    运行结果如下:
    matched:  192.168.1.1
    matched:  255.255.255.0
    matched:  10.0.0.1
    No matched!
    No matched!
    No matched!
    

    **说明:**这个正则表达式 ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 用于匹配 IPv4 地址格式,其中每个数字范围是从 0 到 255。以下是一些示例说明:

    • 匹配

      • 192.168.1.1
      • 255.255.255.0
      • 10.0.0.1
    • 不匹配

      • 256.168.1.1(超出了允许的范围)
      • 192.168.1.(末尾缺少数字)
      • 1.1.1(缺少完整的四组数字)

    这个正则表达式能够有效匹配符合标准 IPv4 地址格式的字符串,确保每个数字在 0 到 255 的范围内。

    这个正则表达式 ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 的语法可以解释如下:

    • ():用于分组,将其中的内容视为一个整体。
    • (2[0-4]\d|25[0-5]|[01]?\d\d?):表示匹配 0 到 255 之间的数字。具体说明如下:
      • 2[0-4]\d:匹配 200 到 249 之间的数字。
      • 25[0-5]:匹配 250 到 255 之间的数字。
      • [01]?\d\d?:匹配 0 到 199 之间的数字,包括各种可能的组合(如 01、10、100 等)。
    • (2[0-4]\d|25[0-5]|[01]?\d\d?)\.:匹配三组符合上述范围内的数字后跟一个点号。
    • {3}:指定前面的分组恰好重复三次。
    • (2[0-4]\d|25[0-5]|[01]?\d\d?):匹配最后一组符合条件的数字。

    这个正则表达式的结构设计得很巧妙,能够有效地匹配符合 IPv4 地址格式的字符串,确保每个数字在正确的范围内,并使用点号作为分隔符。

  8. HTML标签

    import re
    
    pattern = re.compile('^<([a-z]+)([^<])*(?:>(.*)<\\/\\1>)$')
    
    html_lst = ['<div>Hello</div>','<p>This is a paragraph</p>','<span class="highlight">Highlighted text</span>','<strong>Bold text','<ul><li>Item 1</li></ul>','<a href="example.com">Link</a>']
    
    for html in html_lst:
        if pattern.match(html):
            print('matched: ', html)
        else:
            print('No matched!')
            
    运行结果如下:
    matched:  <div>Hello</div>
    matched:  <p>This is a paragraph</p>
    matched:  <span class="highlight">Highlighted text</span>
    No matched!
    matched:  <ul><li>Item 1</li></ul>
    matched:  <a href="example.com">Link</a>
    

    **说明:**这个正则表达式 ^<([a-z]+)([^<])*(?:>(.*)<\\/\\1>)$ 用于匹配简单的 HTML 标签。以下是一些示例说明:

    • 匹配
      • <div>Hello</div>
      • <p>This is a paragraph</p>
      • <span class="highlight">Highlighted text</span>
      • <ul><li>Item 1</li></ul>
      • <a href="example.com">Link</a>
    • 不匹配
      • <strong>Bold text

    在上述示例中,只有与正则表达式匹配的 HTML 标签会被识别,因为正则表达式要求标签要有正确的开头和闭合,并且内容要符合标签名称。

  9. utf-8编码下的汉字范围

import re

pattern = re.compile('^[\u2E80-\u9FFF]+')


utf_lst = ['你好世界, 中文测试','Hello 你好, 12345']

for utf in utf_lst:
    if pattern.match(utf):
        print('matched: ', utf)
    else:
        print('No matched!')
        
运行结果如下:
matched:  你好世界, 中文测试
No matched

**说明:**这个正则表达式 ^[\u2E80-\u9FFF]+ 用于匹配中文字符范围(包括繁体字),Unicode 范围为 \u2E80\u9FFF。这表示匹配从中文第一个汉字(四角号码为2000)到最后一个汉字(四角号码为9FFF)之间的所有字符。

这个正则表达式将只匹配完全由中文字符组成的字符串,而不会匹配包含其他类型字符的字符串。

示例:

  • 匹配:你好世界, 中文测试
  • 不匹配:Hello 你好, 12345

总体来说,这个正则表达式适用于需要验证输入是否仅包含中文字符的情况。

以上示例均在[小蜜蜂AI网站][https://zglg.work]的GPT问答实现。


04-19 05:37