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

news2024/12/27 13:46:37


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

正则表达式(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>...) 语法),这样你就可以在匹配结果中区分出是由哪个模式匹配到的。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java排序算法汇总

一、排序算法我介绍 1.1、介绍 排序也称排序算法(Sort Algorithm)&#xff0c;排序是将一组数据&#xff0c;依指定的顺序进行排列的过程。 1.2、排序的分类&#xff1a; 1) 内部排序&#xff1a;指将需要处理的所有数据都加载到内部存储器中进行排序。 2) 外部排序法&…

Ubuntu22.04.2 k8s部署

k8s介绍 简单介绍 通俗易懂的解释&#xff1a; Kubernetes&#xff08;也被称为 K8s&#xff09;就像是一个大管家&#xff0c;帮你管理你的云计算服务。想象一下&#xff0c;你有很多个小程序&#xff08;我们称之为“容器”&#xff09;&#xff0c;每个都在做不同的事情&…

FastGPT部署通义千问Qwen和智谱glm模型|OneAPI配置免费的第三方API

继这篇博客之后 从零开始FastGPT本地部署|Windows 有同学问&#xff0c;不想在多个平台申请API-Key&#xff0c;不好管理且要付费&#xff0c;有木有白嫖方案呀&#xff1f; 答&#xff1a;有啊。用硅基流动。 注册方法看这篇 【1024送福利】硅基流动送2000万token啦&#xff0…

每日OJ题_牛客_DP36 abb_C++_Java

目录 牛客_DP36 abb 题目解析 C代码1暴力 C代码2DP Java代码 牛客_DP36 abb abb_牛客题霸_牛客网 描述&#xff1a; leafee 最近爱上了 abb 型语句&#xff0c;比如“叠词词”、“恶心心” leafee 拿到了一个只含有小写字母的字符串&#xff0c;她想知道有多少个 &quo…

Redis五大基本类型——String字符串命令详解(命令用法详解+思维导图详解)

目录 一、String字符串类型介绍 二、常见命令 1、SET 2、GET 3、MGET 4、MSET 使用MGET 和 使用多次GET的区别 5、DEL 6、SETNX SET、SET NX和SET XX执行流程 7、INCR 8、INCRBY 9、DECR 10、DECYBY 11、INCRBYFLOAT 12、APPEND 13、GETRANGE 14、SETRANGE …

Dubbo 3.x源码(25)—Dubbo服务引用源码(8)notify订阅服务通知更新

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了接口级的服务引入订阅的refreshInterfaceInvoker方法&#xff0c;当时还有最为关键的notify服务通知更新的部分源码没有学习&#xff0c;本次我们来学习notify通知本地服务更新的源码。 Dubb…

STM32+AI语音识别智能家居系统

基于 STM32 和 AI 语音识别的智能家居系统的详细硬件和软件设计&#xff0c;包括各个模块的详细描述和代码示例。 一、硬件设计 1. 微控制器&#xff08;STM32&#xff09;&#xff1a; 选择 STM32F7 系列或更高性能的芯片&#xff0c;如 STM32F767ZIT6&#xff0c;以满足处理…

飞凌嵌入式RK3576核心板已适配Android 14系统

在今年3月举办的RKDC2024大会上&#xff0c;飞凌嵌入式FET3576-C核心板作为瑞芯微RK3576处理器的行业首秀方案重磅亮相&#xff0c;并于今年6月率先量产发货&#xff0c;为客户持续稳定地供应&#xff0c;得到了众多合作伙伴的认可。 FET3576-C核心板此前已提供了Linux 6.1.57…

elementUI input 禁止内容两端存在空格,或者是自动去除两端空格

需求 项目中有需求&#xff1a;输入框中禁止内容两端存在空格&#xff0c;或者是自动去除两端空格。 解决方法 vue的api文档中有过介绍&#xff0c;使用.trim可以去掉用户输入内容中两端的空格&#xff0c;如下图 代码 <el-input v-model.trim"name" cleara…

初识算法 · 位运算(end)

目录 前言&#xff1a; 题目解析 算法原理 算法编写 前言&#xff1a; 本文作为初识算法 位运算的最后一篇文章&#xff0c;使用一道hard题目来结束这个专题&#xff0c;题目的链接为&#xff1a; 面试题 17.19. 消失的两个数字 - 力扣&#xff08;LeetCode&#xff09;…

3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)

3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用) 文章目录 3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)前言1. Spring Cloud Eureka 的概述1.1 服务治理概述1.2 服务注册与发现 2. 实践&#xff1a;创建单机 Eureka Server 注册中心2.1 需求说明 图解…

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

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

awk(常用)

这个有点难 O.o 一、awk # 语法 awk 参数 模式 {动作} 文件# 第一列&#xff0c;包含p的 $1~"p" # 第一列&#xff0c;不包含p的 $1!~"p" # 开始时干嘛&#xff0c;结束时干嘛 awk BEGIN{开始时做的事}END{结束时做的事}{print $0} 文件 1、内置变量&…

EXPLAIN优化慢SQL

项目中发现数据查询很慢&#xff0c;导致前端超时等待的问题。经过日志打印发现&#xff0c;查询sql耗时10秒以上&#xff0c;相关sql如下&#xff1a; select distincttablemodel.*from pjtask_model tablemodelJOIN buss_type_permission a ON (tablemodel.fields_data_id …

Skywalking搭建-来自于图灵课堂

Skywalking主要用于链路追踪&#xff0c;日志收集查看&#xff0c;异常日志查看&#xff0c;服务监控弱一些&#xff0c;服务器监控可以使用prometheus 一、搭建服务端&#xff0c;使用startup.bat启动 配置持久化&#xff0c;如果是用mysql持久化&#xff0c;拷贝mysql链接包…

ZooKeeper单机、集群模式搭建教程

单点配置 ZooKeeper在启动的时候&#xff0c;默认会读取/conf/zoo.cfg配置文件&#xff0c;该文件缺失会报错。因此&#xff0c;我们需要在将容器/conf/挂载出来&#xff0c;在制定的目录下&#xff0c;添加zoo.cfg文件。 zoo.cfg logback.xml 配置文件的信息可以从二进制包…

计算机网络(11)和流量控制补充

这一篇对数据链路层中的和流量控制进行详细学习 流量控制&#xff08;Flow Control&#xff09;是计算机网络中确保数据流平稳传输的技术&#xff0c;旨在防止数据发送方发送过多数据&#xff0c;导致接收方的缓冲区溢出&#xff0c;进而造成数据丢失或传输失败。流量控制通常…

二元一次不定方程@整数解问题

文章目录 二元一次不定方程|整数解定理1整数解存在充要条件定理2 通解特解知识回顾利用辗转相除法求例 使用表达式凑出通解 二元一次不定方程|整数解 二元一次不定方程的一般形式为 a x b y c ax by c axbyc(1) 其中 a a a、 b b b、 c c c 是整数&#xff0c;且 a a a…

深入理解Flutter生命周期函数之StatefulWidget(一)

目录 前言 1.为什么需要生命周期函数 2.开发过程中常用的生命周期函数 1.initState() 2.didChangeDependencies() 3.build() 4.didUpdateWidget() 5.setState() 6.deactivate() 7.dispose() 3.Flutter生命周期总结 1.调用顺序 2.函数调用时机以及主要作用 4.生…

llama factory lora 微调 qwen2.5 7B Instruct模型

项目背景 甲方提供一台三卡4080显卡 需要进行qwen2.5 7b Instruct模型进行微调。以下为整体设计。 要使用 LLaMA-Factory 对 Qwen2.5 7B Instruct模型 进行 LoRA&#xff08;Low-Rank Adapters&#xff09;微调&#xff0c;流程与之前提到的 Qwen2 7B Instruct 模型类似。LoRA …