python--re库

news2024/9/21 0:32:58

目录

re库初识

re库基础使用方法

compile()函数

基本用法

正则表达式常用规则字符

match与search方法

match

search

match/search

findall与finditer方法

使用findall()返回所有匹配项

使用findall()提取多个组的匹配

使用finditer()逐个返回Match对象

使用finditer()并处理复杂匹配结构

进阶用法

分组与反向引用

替换文本中的部分内容

提取并重组子组

在搜索结果中使用子组

贪婪与懒惰匹配

预定义字符集与特殊字符

结语与讨论


re库初识

Python的re模块提供了完整的正则表达式功能。正则表达式(Regular Expression)是一种强大的文本模式匹配工具,它能高效地进行查找、替换、分割等复杂字符串操作。

在Python中,通过 import re 即可引入这一神器。 


re库基础使用方法

compile()函数

首先,我们需要使用re.compile()函数将正则表达式编译为Pattern对象

基本用法

import re
 
# 匹配一个或多个连续的数字字符
pattern = re.compile(r'\d+') 
 
# 匹配email电邮地址
email_pattern = re.compile(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', re.IGNORECASE)
 
# 匹配任意字母数字组成的用户名(至少1个字符)
username_pattern = re.compile(r'\w+')
 
# 匹配任意URL链接
url_pattern = re.compile(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+')
 
# 匹配电话号码(格式如:123-456-7890 或 (123) 456-7890)
phone_pattern = re.compile(r'(\d{3}[-\.\s]??\d{3}[-\.\s]??\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]??\d{4})')
 
# 匹配IPv4地址
ipv4_pattern = re.compile(r'(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)')
 
# 匹配信用卡号(一般为16位数字,可能包含空格分隔符)
credit_card_pattern = re.compile(r'\d{4}[- ]?\d{4}[- ]?\d{4}[- ]?\d{4}')
 
# 匹配日期格式(YYYY-MM-DD)
date_pattern = re.compile(r'\d{4}-\d{2}-\d{2}')
 
# 匹配颜色代码(如 #FF0000)
color_code_pattern = re.compile(r'^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$')
 
# 匹配整数和小数(包括负数、正数和零)
number_pattern = re.compile(r'-?\d+(\.\d+)?')

正则表达式常用规则字符

  • \d:在大多数正则表达式语法中(包括Python中的 re 模块),\d 相当于 [0-9],即它会匹配任意一个十进制数字字符,相当于阿拉伯数字从0到9。
  • +:这是一个量词,表示前面的元素(这里是\d)至少出现一次或多次。因此,\d+ 作为一个整体,它会匹配一个或连续的一个以上数字字符,例如 "123"、"456789" 等等。

  • \w:匹配字母(大写或小写)、数字和下划线(等价于 [a-zA-Z0-9_])。

  • \s:匹配任何空白字符,包括空格、制表符、换行符等。
  • (句点):匹配除换行符之外的任何单个字符。
  • ^:在字符串起始位置时匹配,或者在字符类 [] 中表示反向选择(如 [^abc] 匹配非 a、b、c 的字符)。
  • $:在字符串结束位置时匹配。
  • *:零次或多次匹配前面的元素。
  • ?:零次或一次匹配前面的元素。
  • {m,n}:前面的元素至少出现 m 次,至多出现 n 次。
  • |:表示“或”操作,用于匹配多个选项之一。
  • ():用于分组和捕获子匹配项。

re.compile(pattern, flags=0) 的作用是:

  1. 预编译:将正则表达式转换为编译过的模式对象,提高后续匹配操作的速度。
  2. 复用:创建一次编译好的模式后,可以在程序的不同地方重复使用该模式进行匹配、查找、替换等操作。
  3. 支持标志:可以传递标志参数来改变正则表达式的默认行为,如忽略大小写、多行模式等。

match与search方法

pattern.match()方法只检测字符串开始位置是否满足匹配条件;而pattern.search()方法会搜索整个字符串以找到第一个匹配项。

match

import re
 
text = "2023-01-01 This is a date at the start of the string."
 
# 使用match()方法,只从字符串开始位置匹配日期格式
pattern = re.compile(r'\d{4}-\d{2}-\d{2}')
match_result = pattern.match(text)
 
if match_result:
    print(f"Match found: {match_result.group(0)}")
else:
    print("No match at the beginning of the string.")
 
# 输出:
# Match found: 2023-01-01
import re
 
text = "The date today is 2023-01-01, let's remember it."
 
# 使用search()方法在整个字符串中搜索日期格式
pattern = re.compile(r'\d{4}-\d{2}-\d{2}')
search_result = pattern.search(text)
 
if search_result:
    print(f"Search found: {search_result.group(0)}")
else:
    print("No match found in the string.")
 
# 输出:
# Search found: 2023-01-01

match/search

import re
 
text = "This sentence does not start with a date like 2023-01-01."
 
# match()不会找到任何匹配项,因为日期不在字符串开头
match_result = re.match(r'\d{4}-\d{2}-\d{2}', text)
if match_result:
    print("Match found.")
else:
    print("No match at the beginning using match().")
 
# search()能找到匹配项,因为它搜索整个字符串
search_result = re.search(r'\d{4}-\d{2}-\d{2}', text)
if search_result:
    print("Search found.")
else:
    print("No match found anywhere using search().")
 
# 输出:
# No match at the beginning using match().
# Search found.

findall与finditer方法

pattern.findall()返回所有非重叠匹配结果的列表;pattern.finditer()返回一个迭代器,逐个返回Match对象。

使用findall()返回所有匹配项

import re
 
text = "The3 quick5 brown5 fox3 jumps5 over4 the3 lazy4 dog."
 
# 找到文本中所有的"fox"
pattern = re.compile(r'\d+')
matches = pattern.findall(text)
 
print(matches)
 
# 输出: ['3', '5', '5', '3', '5', '4', '3', '4']

使用findall()提取多个组的匹配

import re
 
text = "John Doe, Jane Smith, Alice Johnson"
 
# 提取所有名字和姓氏
pattern = re.compile(r'(\w+) (\w+)')
matches = pattern.findall(text)
 
print(matches)
 
# 输出: [('John', 'Doe'), ('Jane', 'Smith'), ('Alice', 'Johnson')]
 
# 返回的是元组组成的列表,每个元组代表一个匹配的结果,其中包含了括号分组的内容

使用finditer()逐个返回Match对象

import re
 
text = "I have 3 apples and 7 bananas in 2 baskets."
 
# 查找所有数字
pattern = re.compile(r'\d+')
 
for match in pattern.finditer(text):
    print(match.group(0))
 
# 输出:
# 3
# 7
# 2
# finditer()方法逐个返回Match对象,并可以通过group()方法获取匹配的具体内容

使用finditer()并处理复杂匹配结构

import re
 
text = "colors: red, colors:blue; shapes: square, shapes:circle"
 
# 匹配颜色或形状
pattern = re.compile(r'(?:colors?[:\s]+(\w+)(?:[,;\s]|$))|(?:shapes?[:\s]+(\w+)(?:[,;\s]|$))')
 
for match in pattern.finditer(text):
    if match.group(1):  # 如果是颜色
        print(f"Color found: {match.group(1)}")
    elif match.group(2):  # 如果是形状
        print(f"Shape found: {match.group(2)}")
 
# 输出:
# Color found: red
# Color found: blue
# Shape found: square
# Shape found: circle

进阶用法

分组与反向引用

通过圆括号可以创建子组,以便捕获和引用部分匹配内容。如re.compile(r'(\w+) (\d+)')\1\2分别代表第一个和第二个子组的内容。

替换文本中的部分内容

import re
 
text = "John Doe has 3 apples and Jane Smith has 7 bananas."
pattern = re.compile(r'(\w+) (\d+)')
new_text = pattern.sub(r'\1 has \2 fruits', text)
 
print(new_text)
# 输出: "John Doe has 3 fruits and Jane Smith has 7 fruits."
 
# 在这个例子中,\1 替换为第一个子组(名字),\2 替换为第二个子组(数字)

提取并重组子组

import re
 
text = "The date is 2023-01-01, and the time is 15:30:45."
pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})')
 
match = pattern.search(text)
if match:
    date_reformatted = f"{match.group(1)}.{match.group(2)}.{match.group(3)}"
    print(date_reformatted)
    # 输出: "2023.01.01"
 
    # 这里直接通过group()方法获取每个子组的内容,并重新组合

在搜索结果中使用子组

import re
 
text = "Some emails are user1@exam.com, user2@apple.net, and user3@example.org."
pattern = re.compile(r'([\w.%+-]+)@([\w.-]+)\.([a-z]{2,})')
 
matches = pattern.findall(text)
for email in matches:
    username, domain, dtype = email[0], email[1], email[2]
    print(f"Username: {username}, Domain: {domain}.{dtype}")
    
    # 使用子组匹配的邮箱用户名和域名
    # 输出:
    # Username: user1, Domain: exam.com
    # Username: user2, Domain: apple.net
    # Username: user3, Domain: example.org

贪婪与懒惰匹配

*+?后添加?可变为非贪婪模式,尽可能少地匹配字符。

贪婪与非贪婪的 * 量词

import re
 
text = "I love Python programming and Java programming very much!"
 
# 贪婪模式
pattern_greedy = re.compile(r'love.*programming')
match_greedy = pattern_greedy.search(text)
print(match_greedy.group(0))  # 输出: 'love Python programming and Java programming'
 
# 非贪婪模式
pattern_lazy = re.compile(r'love.*?programming')
match_lazy = pattern_lazy.search(text)
print(match_lazy.group(0))  # 输出: 'love Python programming'

贪婪与非贪婪的 + 量词

import re
 
text = "The numbers are 139-626 and 123456."
 
# 贪婪模式
pattern_greedy = re.compile(r'\d+')
matches_greedy = pattern_greedy.findall(text)
print(matches_greedy)
# 输出: ['139', '626', '123456']
 
# 非贪婪模式
pattern_lazy = re.compile(r'\d+?')
matches_lazy = pattern_lazy.findall(text)
print(matches_lazy)
# 输出: ['1', '3', '9', '6', '2', '6', '1', '2', '3', '4', '5', '6']

 贪婪与非贪婪的 ? 量词

import re
 
text = "Optional text or not?"
 
# 贪婪模式
pattern_greedy = re.compile(r'(Optional)?.*')
match_greedy = pattern_greedy.search(text)
print(match_greedy.group(0))  # 输出: 'Optional text or not?'
 
# 非贪婪模式
pattern_lazy = re.compile(r'(Optional)?.*?')
match_lazy = pattern_lazy.search(text)
print(match_lazy.group(0))  # 输出: 'Optional'

预定义字符集与特殊字符

\d\D\w\W\s\S分别代表数字、非数字、单词字符、非单词字符、空白符、非空白符。

结语与讨论

正则表达式和re库的强大远不止于此,其深度和灵活性足以应对各种复杂的文本处理场景。然而,掌握好这门艺术需要不断的实践和积累,本文只是带你踏入了Python re库的门槛,但正则表达式的奥秘还等待着你进一步挖掘。实践中如果遇到“明明规则写得对,为何匹配不上?”这类疑问,不妨回看本文,或是在留言区留下你的问题,我们一同探讨解惑,让正则表达式真正成为你手中的“文本魔法棒”。

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

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

相关文章

会声会影2024旗舰版新功能介绍及2024最新视频制作教程

随着科技的不断发展,视频制作已经不再是专业人士的专属领域,越来越多的人开始使用各种视频制作软件来记录生活、创作内容。其中,会声会影是被广泛使用的一款视频制作软件,其旗舰版更是备受关注。 据悉,会声会影2024旗舰…

pyqt5+python子域名扫描程序

import sysfrom PyQt5 import uic from PyQt5.QtWidgets import * #requests库内置了不同的方法来发送不同类型的http请求 import requests#BS主要功能是从网页抓取数据,提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能 from bs4 import Beau…

Google Gemini API快速上手

一、前言 12月6日,谷歌发布新一代大模型Gemini的demo, 同时,Bard已将模型更新为Gemini Pro Gemini 是谷歌目前最新最强的大语言模型,支持多模态(文字,图片,音频,视频等等)处理 美…

K8S--部署Nacos

原文网址:K8S--部署Nacos-CSDN博客 简介 本文介绍K8S部署Nacos的方法。Nacos版本是:2.2.3。 部署方案 本文为了简单,使用此部署方式:使用本地pvconfigmap,以embedded模式部署单机nacos。以nodePort方式暴露端口。 …

如何使用 Typora 进行效率写作

引言 在数字化时代,写作已经成为我们生活中不可或缺的一部分。为了提高写作效率,寻找一款简单而功能强大的编辑器显得尤为重要。而Typora,作为一款所见即所得的Markdown编辑器,以其高效的特性和用户友好的界面吸引了众多写作者的…

Linux设备管理模型-02:sysfs

文章目录 sysfs1 使用sysfs控制GPIO2 sysfs编程2.1 完善sysfs属性文件的读写操作 上一篇文: 设备管理模型中的基础数据结构 sysfs sysfs是用于导出内核对象的文件系统,它是一个基于ram的文件系统,最初基于ramfs。 sysfs通常挂载在/sys目录下。它提供了一…

推荐新版AI智能聊天系统网站源码ChatGPT NineAi

Nine AI.ChatGPT是基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊天交流,甚至能完成撰写邮件、视频脚本、文案、翻译、代…

管理信息系统知识点复习

目录 一、名词解释题1.企业资源规划(ERP)2.面向对象方法:3.电子健康:4.供应链5.数据挖掘6.“自上而下”的开发策略:7.业务流程重组8.面向对象:9.决策支持系统10.聚类11.集成开发环境:12.供应商协同13.数据仓库14.深度学…

interpret,一个超酷的 Python 库

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个超酷的 Python 库 - interpret。 Github地址:https://github.com/interpretml/interpret Python Interpret 是一个强大的开源工具,它为 Python 开发…

我为什么不建议使用框架默认的 DefaultMeterObservationHandler

我为什么不建议使用框架默认的 DefaultMeterObservationHandler 个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判。如果大家发现网上有抄袭本文章的&a…

传统语音识别系统流程

文章目录 概述语音识别原理公式语音识别术语:分帧提取声学特征声学模型 概述 语音识别传统方法主要分两个阶段:训练和识别,训练阶段主要是生成声学模型和语言模型给识别阶段用。传统方法主要有五大模块组成,分别是特征提取&#…

JVM 如何判断一个对象可以被回收

Hi, 我是 浮生。 今天分享一道一线互联网公司必问的面试题。 ”JVM 如何判断一个对象可以被回收“ 关于这个问题,来看看高手的回答。 一、问题解析 在 JVM 里面,要判断一个对象是否可以被回收,最重要的是判断这个对象是否还在被…

XHCMS靶场小记(熊海)

文件包含漏洞 template下的header.php中存在文件包含漏洞(该文件被file文件夹下的多数文件进行包含) f参数可以包含任意文件通过php格式解析(这是文件包含点) 代码分析 根目录下的index.php文件;r参数用于获取包含文…

怎样使用崭新的硬盘

新买的一块硬盘,接到电脑上,打开机器,却找不到新的硬盘,怎么回事?新的硬盘是坏的么?怎样才能把新硬盘用起来? 可能有几种原因导致您的电脑无法识别新的硬盘。以下是一些建议的解决方法&#xff…

SOCKET编程和TCP通信案例三次握手四次挥手

文章目录 一、SOCKET1、网络套接字SOCKET2、网络字节序2.1、小端法2.2、大端法2.3、字节序转换3、IP地址转换函数3.1、本地字节序转网络字节序3.1.1、函数原型:3.1.2、返回值3.2、网络字节序转本地字节序3.2.1、函数原型3.2.2、返回值4、sockaddr地址结构&#xff0…

Android Termux技能大揭秘:安装MySQL并实现公网远程连接

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、Cpolar杂谈 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. 安装MariaDB二. 安装cpolar内网穿透工具三. 创建安全隧道映射mysql四. 公网…

Linux下安装docker

1、查看系统版本 Docker支持64位版本的CentOS 7和CentOS 8及更高版本,它要求Linux内核版本不低于3.10。查看Linux版本的命令这里推荐两种:lsb_release -a或cat /etc/redhat-release。 显然,当前Linux系统为CentOS7。再查一下内核版本是否不低…

MCM备赛笔记——蒙特卡罗方法

Key Concept 蒙特卡罗方法(Monte Carlo Method),也称为统计模拟方法,是一种基于概率和统计的数值计算方法。该方法使用随机数(或更常见的伪随机数)来解决可能非常复杂的数学或物理问题。蒙特卡罗方法广泛应…

关于xftp突然无法连接服务器或虚拟机,可以ping通自己的虚拟机ip地址

关于xftp突然无法连接服务器或虚拟机,ping自己的虚拟机ip地址可以ping通 主机能ping通虚拟机&#xff08;ubuntu&#xff09; C:\Users\42216\Desktop>ping 192.168.61.128正在 Ping 192.168.61.128 具有 32 字节的数据: 来自 192.168.61.128 的回复: 字节32 时间<1ms …

链表的相交

链表的相交 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/intersection-of-tw…