Python实用正则表达式归纳

本文涉及的产品
.cn 域名,1个 12个月
简介: Python实用正则表达式归纳

实用正则表达式归纳
根据日常工作、学习经常用到的场景总结归纳如下表所示:
image.png
结合小示例如下:

匹配用户名

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位,并且只包含数字、小写字母、下划线和短横线。

匹配密码

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 位,并且只包含小写字母、数字、下划线和短横线。

手机号码

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(长度不足)

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

颜色的十六进制

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(未满足 36 位)
- #xyz123(包含非法字符)

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

电子邮箱

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(包含空格)

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

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 格式。以下是一些示例说明:

匹配:

不匹配:

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

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 地址格式的字符串,确保每个数字在正确的范围内,并使用点号作为分隔符。

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 标签。以下是一些示例说明:

匹配:

  • Hello
  • This is a paragraph

  • Highlighted text
    • Item 1
  • Link

不匹配:

  • Bold text

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

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

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

  1. 0-9a-z_- ↩︎
  2. a-z0-9_- ↩︎
  3. \u2E80-\u9FFF ↩︎
相关文章
|
26天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
2天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
316 14
|
18天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
5天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
20天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
22天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2585 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
4天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
177 2
|
3天前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
103 65
|
6天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
286 2
|
22天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1580 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码