Python 正则表达式的一些介绍和使用方法说明(数字、字母和数字、电子邮件地址、网址、电话号码(简单)、IPv4 )


## 正则表达式的概念和用途

正则表达式(Regular Expression,简称Regex)是对字符串操作的一种逻辑公式,由一些事先定义好的特定字符以及这些特定字符的组合所构成。这些特定字符及其组合被用来描述在搜索文本时要匹配的一个或多个字符串。正则表达式的用途非常广泛,包括但不限于:

匹配和查找文本‌:快速匹配和查找特定模式的文本,如查找包含特定单词的句子、匹配邮箱、电话等。
‌数据清洗和处理‌:去除特定字符或标签、提取文本中的有效信息等。
‌表单验证‌:验证用户输入的表单数据,如验证邮箱地址是否合法。
‌字符串替换‌:将文本中的某个模式替换为另一个字符串。
‌提取信息‌:提取特定的信息,例如提取网页中的链接、日志中的关键信息等。


Python中正则表达式的基本语法

Python中正则表达式的处理主要通过re模块来实现。re模块提供了一系列函数来执行正则表达式的匹配、查找、替换等操作。基本语法示例


匹配字符串


python

import re

# 使用match函数从字符串起始位置匹配
match_obj = re.match(r'hello', 'hello world')
if match_obj:
    print("Match found:", match_obj.group())
else:
    print("No match")

# 注意:match函数仅从字符串起始位置开始匹配
match_obj = re.match(r'world', 'hello world')
if not match_obj:
    print("No match from start")

搜索字符串


python

# 使用search函数在字符串中搜索第一个匹配项
search_obj = re.search(r'world', 'hello world')
if search_obj:
    print("Search found:", search_obj.group())
else:
    print("No search found")
常见特殊字符的含义
.:匹配除换行符以外的任意字符。
^:匹配字符串的开始。
$:匹配字符串的结束。
*:匹配前面的子表达式零次或多次。
+:匹配前面的子表达式一次或多次。
?:匹配前面的子表达式零次或一次。
{n}:n 是一个非负整数。匹配确定的 n 次。
{n,}:n 是一个非负整数。至少匹配n 次。
{n,m}:m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
[xyz]:字符集合。匹配所包含的任意一个字符。
[^xyz]:负值字符集合。匹配未包含的任意字符。
\d:匹配一个数字字符。等价于 [0-9]。
\D:匹配一个非数字字符。等价于 [^0-9]。
\s:匹配任何空白字符,包括空格、制表符、换页符等。
\S:匹配任何非空白字符。
\w:匹配包括下划线的任何单词字符。等价于[A-Za-z0-9_]。
\W:匹配任何非单词字符。等价于 [^A-Za-z0-9_]。


Python正则表达式库(re库)的高级功能和用法


编译正则表达式

为了提高匹配效率,特别是当需要多次使用同一个正则表达式时,可以使用re.compile()函数对正则表达式进行编译,并返回一个模式(Pattern)对象。

python

pattern = re.compile(r'\bfoo\b')
match = pattern.match('foo bar')
if match:
    print("Match:", match.group())findall 和 finditer

findall(pattern, string, flags=0):在字符串中找到正则表达式所匹配的所有子串,并返回一个列表。
finditer(pattern, string, flags=0):和findall类似,但返回的是一个迭代器,每个迭代元素是Match对象。


python

# 使用findall
print(re.findall(r'\bfoo\b', 'foo bar foo baz'))  # 输出: ['foo', 'foo']

# 使用finditer
for match in re.finditer(r'\bfoo\b', 'foo bar foo baz'):
    print(match.group())  # 输出: foo foo

分组和命名分组

正则表达式的圆括号可以实现分组功能,还可以通过?P<name>语法给分组命名。

python
 

# 分组
match = re.match(r'(\w+) (\w+)', 'Isaac Newton')
if match:
    print(match.group(1))  # Isaac
    print(match.group(2))  # Newton

# 命名分组
match = re.match(r'(?P<first_name>\w+) (?P<last_name>\w+)', 'Isaac Newton')
if match:
    print(match.group('first_name'))  # Isaac
    print(match.group('last_name'))   # Newton

贪婪模式与非贪婪模式

在正则表达式中,默认是贪婪模式,即尽可能多地匹配字符。通过在量词后面加上?可以使其变为非贪婪模式,即尽可能少地匹配字符。

python

# 贪婪模式
print(re.match(r'a(.*)c', 'abcabc').group(1))  # abcabc

# 非贪婪模式
print(re.match(r'a(.*?)c', 'abcabc').group(1))  # abc

分割和替换
split(pattern, string, maxsplit=0, flags=0):根据正则表达式的匹配项来分割字符串。
sub(pattern, repl, string, count=0, flags=0):用指定的内容替换掉与正则表达式匹配的内容。
python
Copy Code
# 分割
print(re.split(r'\s+', 'one two   three   four'))  # ['one', 'two', 'three', 'four']

# 替换
print(re.sub(r'\s+', '-', 'one two   three   four'))  # one-two-three-four


以上就是Python中正则表达式的基本概念、基本语法、高级功能以及示例代码。希望这能帮助你更好地理解和使用Python中的正则表达式。


创建一个只匹配电子邮箱地址的正则表达式

在Python中使用它,你可以使用re模块。以下是一个示例代码,它定义了一个正则表达式来匹配电子邮箱地址,并使用该正则表达式来验证输入字符串是否为有效的电子邮箱地址。

python

import re

# 定义匹配电子邮箱地址的正则表达式
email_regex = re.compile(
    r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"
)

def is_valid_email(email):
    """
    检查给定的字符串是否为有效的电子邮箱地址。
    
    参数:
    email (str): 要检查的电子邮箱地址。
    
    返回:
    bool: 如果字符串是有效的电子邮箱地址,则返回True;否则返回False。
    """
    return bool(email_regex.match(email))

# 测试示例
test_emails = [
    "example@example.com",
    "user.name@domain.co.in",
    "user-name@domain.org",
    "user_name@domain.com",
    "username@domain",
    "@nousername.com",
    "username@.com",
    "username@domain..com",
]

for email in test_emails:
    print(f"{email}: {is_valid_email(email)}")

解释‌

正则表达式‌:

^[a-zA-Z0-9_.+-]+: 匹配电子邮箱地址的开始部分(用户名),可以包含字母、数字、下划线、点、加号或减号。
@[a-zA-Z0-9-]+: 匹配@符号后面的域名部分,可以包含字母、数字或短横线。
\.[a-zA-Z0-9-.]+$: 匹配域名后面的顶级域名(TLD),可以包含字母、数字、点或短横线,并以字符串的结尾结束。

‌is_valid_email函数‌:

使用email_regex.match(email)来检查给定的电子邮箱地址是否与正则表达式匹配。
bool()函数将匹配结果转换为布尔值(True或False)。

‌测试示例‌:

列出了一些测试电子邮箱地址,并打印每个地址是否为有效的电子邮箱地址。

运行上述代码,你将看到每个测试电子邮箱地址的验证结果。


创建一个只匹配所有常用正则表达式的正则表达式

首先需要明确什么是“常用正则表达式”。由于正则表达式的功能非常广泛,不同的场景会使用不同的模式。以下是一些常见的正则表达式模式,你可以根据需求组合和扩展这些模式:

数字:\d+
字母:[a-zA-Z]+
字母和数字:[a-zA-Z\d]+
电子邮件地址:[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
网址:https?://(?:www\.)?[a-zA-Z0-9./?=_-]+
电话号码(简单):[0-9]{3}-[0-9]{2}-[0-9]{4} 或 \d{10}
IPv4 地址:(?:\d{1,3}\.){3}\d{1,3}
邮政编码(例如美国):\d{5}(?:-\d{4})?

由于一个正则表达式无法直接匹配另一个正则表达式(正则表达式的嵌套匹配非常复杂且通常不可行),你可以创建一个包含多个常用模式的正则表达式,并使用逻辑“或”运算符(|)将它们组合在一起。

以下是一个示例代码,展示如何组合这些常用模式:

python

import re

# 定义常用正则表达式模式
patterns = [
    r'\d+',                          # 数字
    r'[a-zA-Z]+',                    # 字母
    r'[a-zA-Z\d]+',                  # 字母和数字
    r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}',  # 电子邮件地址
    r'https?://(?:www\.)?[a-zA-Z0-9./?=_-]+',  # 网址
    r'[0-9]{3}-[0-9]{2}-[0-9]{4}|\d{10}',  # 电话号码
    r'(?:\d{1,3}\.){3}\d{1,3}',        # IPv4 地址
    r'\d{5}(?:-\d{4})?'               # 邮政编码
]

# 使用逻辑“或”运算符组合所有模式
combined_pattern = '|'.join(f'(?P<pattern_{i}>{p})' for i, p in enumerate(patterns))

# 编译组合后的正则表达式
regex = re.compile(combined_pattern)

# 测试字符串
test_strings = [
    "12345",
    "hello",
    "hello123",
    "example@example.com",
    "https://www.example.com",
    "123-45-6789",
    "192.168.1.1",
    "12345-6789"
]

# 匹配测试字符串
for test in test_strings:
    matches = regex.finditer(test)
    for match in matches:
        for key, value in match.groupdict().items():
            if value:
                print(f"Matched {value} with pattern {key}")

以上代码不能够逐个匹配,换成以下代码就可以输出结果:

import re
 
# 定义常用正则表达式模式
patterns = [
    r'\d+',                          # 数字
    r'[a-zA-Z]+',                    # 字母
    r'[a-zA-Z\d]+',                  # 字母和数字
    r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}',  # 电子邮件地址
    r'https?://(?:www\.)?[a-zA-Z0-9./?=_-]+',  # 网址
    r'[0-9]{3}-[0-9]{2}-[0-9]{4}|\d{10}',  # 电话号码
    r'(?:\d{1,3}\.){3}\d{1,3}',        # IPv4 地址
    r'\d{5}(?:-\d{4})?'               # 邮政编码
]
 
# 使用逻辑“或”运算符组合所有模式
combined_pattern = '|'.join(f'(?P<pattern_{i}>{p})' for i, p in enumerate(patterns))
 
# 编译组合后的正则表达式
regex = re.compile(combined_pattern)
 
# 测试字符串
test_strings = [
    "12345",
    "hello",
    "hello123",
    "example@example.com",
    "https://www.example.com",
    "123-45-6789",
    "192.168.1.1",
    "12345-6789"
]
 
# 匹配测试字符串
for test in test_strings:
    #matches = regex.finditer(test)
    for pattern in patterns:
        regex = re.compile(pattern)
        match_t = regex.match(test)
        print(match_t)
    #for match in matches:
        #for key, value in match.groupdict().items():
            #if value:
                #print(f"Matched {value} with pattern {key}")

结果如下;


在这个示例中,每个模式都被赋予了一个命名捕获组(通过 (?P<pattern_i>...) 语法),这样你就可以在匹配结果中区分出是由哪个模式匹配到的。

请注意,这只是一个示例,并且根据你的具体需求,你可能需要添加或修改这些模式。

欢迎交流,有问题就留言!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/916706.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DreamClear:字节跳动开源了高性能图像修复技术,中科院加持,商业免费使用

哇&#xff0c;字节跳动开源了DreamClear项目&#xff0c;采用的是Apache-2.0开源协议&#xff0c;可以商用&#xff0c;并且用户可以自由地使用、复制、修改和分发该软件&#xff0c;甚至可以用于私有项目中。这对于开发者和企业来说是个好消息&#xff0c;因为它们可以利用这…

Flutter:android studio无法运行到模拟机的问题

提示如下错误信息&#xff1a; Entrypoint is not a Dart filenot applicable for the "main.dart" configurat点击运行按钮提示让填写以下信息 或者出现无法选择模拟机的情况 发下下列问题&#xff1a; 无法运行的项目默认根目录地址&#xff1a; 可以正常运行…

FromData格式提交接口时入参被转成JSON格式问题

本地上传文件后通过事件提交文件&#xff0c;一般先通过前端组件生成文本流&#xff0c;在通过接口提交文本流&#xff0c;提交文本流一般使用FormData的入参形式传入&#xff0c;接口请求头也默认"Content-Type": “multipart/form-data”&#xff0c;但是某些场景统…

<AI 学习> 下载 Stable Diffusions via Windows OS

注意&#xff1a; 不能使用 网络路径 不再支持 HTTPS 登录&#xff0c;需要 Token 1. 获得合法的授权 Stability AI License — Stability AI 上面的链接打开&#xff0c;去申请 许可 2. 拥有 HuggingFace 账号 注册&#xff1a;https://huggingface.co/ 3. 配置 Tok…

MySQL缓存使用率超过80%的解决方法

MySQL缓存使用率超过80%的解决方法 一、识别缓存使用率过高的问题1.1 使用SHOW GLOBAL STATUS命令监控1.2 监控其他相关指标二、分析缓存使用率过高的原因2.1 数据量增长2.2 查询模式变化2.3 配置不当三、解决缓存使用率过高的方法3.1 调整Buffer Pool大小3.1.1 计算合理的Buff…

39.安卓逆向-壳-smali语法3(方法)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。 工…

《FreeRTOS任务基础知识以及任务创建相关函数》

目录 1.FreeRTOS多任务系统与传统单片机单任务系统的区别 2.FreeRTOS中的任务&#xff08;Task&#xff09;介绍 2.1 任务特性 2.2 FreeRTOS中的任务状态 2.3 FreeRTOS中的任务优先级 2.4 在任务函数中退出 2.5 任务控制块和任务堆栈 2.5.1 任务控制块 2.5.2 任务堆栈…

RHCE的学习(18)

第二章 变量和引用 深入认识变量 在程序设计语言中&#xff0c;变量是一个非常重要的概念。也是初学者在进行Shell程序设计之前必须掌握的一个非常基础的概念。只有理解变量的使用方法&#xff0c;才能设计出良好的程序。本节将介绍Shell中变量的相关知识。 什么是变量 顾名思义…

AG32 FPGA部分简单开发

环境 Quartus 13.0&#xff08;Quartus 不能使用Lite 版本&#xff0c;需要使用Full 版本&#xff09;AGM SDKSupra&#xff08;快捷方式在SDK目录下&#xff0c;具体路径为AgRV_pio\packages\tool-agrv_logic\bin&#xff09; FPGA编程 在AG32芯片中&#xff0c;拥有异构双…

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined

VUE_PROD_HYDRATION_MISMATCH_DETAILS 未明确定义。您正在运行 Vue 的 esm-bundler 构建&#xff0c;它期望这些编译时功能标志通过捆绑器配置全局注入&#xff0c;以便在生产捆绑包中获得更好的tree-shaking优化。 Vue.js应用程序正在使用ESM&#xff08;ECMAScript模块&#…

Spring——事务

事务 JdbcTemplate 简介 Spring框架对JDBC进行封装&#xff0c;使用JdbcTemplate方便实现对数据库操作 准备工作 ①搭建子模块 搭建子模块&#xff1a;spring-jdbc-tx ②加入依赖 <dependencies><!--spring jdbc Spring 持久化层支持jar包--><dependenc…

集合类源码浅析のJDK1.8ConcurrentHashMap(下篇)

文章目录 前言一、分段扩容1、addCount2、transfer3、helpTransfer 二、查询二、删除总结 前言 主要记录ConcurrentHashMap&#xff08;笔记中简称CHM&#xff09;的查询&#xff0c;删除&#xff0c;以及扩容方法的关键源码分析。 一、分段扩容 1、addCount 扩容的逻辑主要在…

H5页面多个视频如何只同时播放一个?

目录 背景1. 首先介绍下 muted 属性2. 监听播放和暂停操作3. 视频播放完毕后返回桌面&#xff0c;再进入H5页面发现视频封面丢失置灰解决思路&#xff1a; 背景 页面模块同时有个四个视频模块&#xff0c;发现可以同时播放四个视频&#xff0c;但是理想的是每次只播放一个。 …

D69【 python 接口自动化学习】- python 基础之数据库

day69 Python 执行 SQL 语句 学习日期&#xff1a;20241115 学习目标&#xff1a; MySQL 数据库&#xfe63;- Python连接redis 学习笔记&#xff1a; redis数据库的用途 使用Python访问redis数据库 使用Python对redis数据库进行读写操作 总结 1. redis是一款高性能的键…

jmeter常用配置元件介绍总结之逻辑控制器

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之逻辑控制器 逻辑控制器1.IF控制器2.事务控制器3.循环控制器4.While控制器5.ForEach控制器6.Include控制器7.Runtime控制器8.临界部分控制器9.交替控制器10.仅一次控制器11.简单控制器12.随机控制器13.随机顺序控制器14.吞…

21.<基于Spring图书管理系统②(图书列表+删除图书+更改图书)(非强制登录版本完结)>

PS&#xff1a; 开闭原则 定义和背景‌ ‌开闭原则&#xff08;Open-Closed Principle, OCP&#xff09;‌&#xff0c;也称为开放封闭原则&#xff0c;是面向对象设计中的一个基本原则。该原则强调软件中的模块、类或函数应该对扩展开放&#xff0c;对修改封闭。这意味着一个软…

springboot实现简单的数据查询接口(无实体类)

目录 前言&#xff1a;springboot整体架构 1、ZjGxbMapper.xml 2、ZjGxbMapper.java 3、ZjGxbService.java 4、ZjGxbController.java 5、调用接口测试数据是否正确 6、打包放到服务器即可 前言&#xff1a;springboot整体架构 文件架构&#xff0c;主要编写框选的这几类…

【已解决】 Tomcat10.1.x使用JSTL标签库

IDEA创建Java EE项目&#xff0c;使用Spring Spring MVC MyBatis框架&#xff0c;使用maven管理依赖。项目当前的环境是&#xff1a; Tomat 10.1.28Maven 3.6.3JDK 17 项目的功能&#xff1a;读取数据库的report表中的数据&#xff0c;返回一个List集合对象reportList在JSP…

权限相关知识

1.Linux权限的概念 在说Linux权限的概念之前我来问大家一个问题&#xff0c;你们觉得什么是权限&#xff1f; 权限平时的体现呢&#xff0c;就比如不是校长的亲戚就不能逛办公室&#xff0c;没充会员的爱奇艺看不了VIP影视剧&#xff0c;没成会员的的蛋糕店拿不到会员价等等等…

uniapp如何i18n国际化

1、正常情况下项目在代码生成的时候就已经有i18n的相关依赖&#xff0c;如果没有可以自行使用如下命令下载&#xff1a; npm install vue-i18n --save 2、创建相关文件 en文件下&#xff1a; zh文件下&#xff1a; index文件下&#xff1a; 3、在main.js中注册&#xff1a…