Python实用正则表达式归纳

实用正则表达式归纳

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

场景 正则表达式
用户名 ^[1](#?([a-f0-9]{6}
密码 ^[2](#?([a-f0-9]{6}
手机号码 ^(?:+86)?1[3-9]\d{9}$
颜色的十六进制值 ^#?([a-f0-9]{6}|[a-f0-9]{3})$
电子邮箱 \w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
URL ^(https?😕/)?([a-z\d-]+.)+[a-z]{2,}(/[\w\d%+-./])$
IP地址 ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
HTML标签 ^<([a-z]+)([^<])(?:>(.)<\/\1>)$
utf-8编码下的汉字范围 ^[3](#?([a-f0-9]{6}

结合小示例如下:

  1. 匹配用户名

    python 复制代码
    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. 匹配密码

    python 复制代码
    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. 手机号码

    python 复制代码
    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. 颜色的十六进制

    python 复制代码
    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. 电子邮箱

    python 复制代码
    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

    python 复制代码
    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地址

    python 复制代码
    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标签

    python 复制代码
    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编码下的汉字范围

python 复制代码
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问答实现。


  1. 0-9a-z_- ↩︎

  2. a-z0-9_- ↩︎

  3. \u2E80-\u9FFF ↩︎

相关推荐
湫ccc31 分钟前
《Python基础》之基本数据类型
开发语言·python
难以触及的高度34 分钟前
mysql中between and怎么用
数据库·mysql
drebander2 小时前
使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
java·python·list
威威猫的栗子2 小时前
Python Turtle召唤童年:喜羊羊与灰太狼之懒羊羊绘画
开发语言·python
墨染风华不染尘2 小时前
python之开发笔记
开发语言·笔记·python
小技与小术3 小时前
数据库表设计范式
数据库·mysql
安迁岚3 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作
运维·服务器·数据库·sql·mysql
安迁岚3 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验九 触发器
数据库·sql·mysql·oracle·实验报告
Dxy12393102163 小时前
python bmp图片转jpg
python
麦麦大数据3 小时前
Python棉花病虫害图谱系统CNN识别+AI问答知识neo4j vue+flask深度学习神经网络可视化
人工智能·python·深度学习