python中正则表达式学习

文章目录

  • 介绍
  • 基本语法
  • 常用函数
    • 捕获组和命名组
    • 非捕获组
    • 贪婪匹配和非贪婪匹配
    • 多行模式和点匹配所有模式
    • 示例总结


介绍

Python 中的正则表达式(regular expressions, 简称 regex)由 re 模块提供。正则表达式是一种用于匹配字符串的强大工具,常用于文本搜索和处理。以下是一些常用的正则表达式语法及其相关说明:

基本语法

  1. 普通字符: 直接匹配字符本身。

    • 示例: abc 匹配字符串 “abc”。
  2. 点号 (.): 匹配除换行符以外的任意字符。

    • 示例: a.c 匹配 “abc”、“a1c” 等。
  3. 字符集 ([]): 匹配方括号中的任意一个字符。

    • 示例: [abc] 匹配 “a”、“b” 或 “c”。
  4. 字符范围: 在字符集内使用 - 表示范围。

    • 示例: [a-z] 匹配所有小写字母。
  5. 排除字符集 ([^]): 匹配不在方括号内的任意字符。

    • 示例: [^abc] 匹配除 “a”、“b”、“c” 之外的任意字符。
  6. 重复次数:

    • *
      

      : 匹配前面的字符0次或多次。

      • 示例: a* 匹配空字符串、“a”、“aa” 等。
    • +
      

      : 匹配前面的字符1次或多次。

      • 示例: a+ 匹配 “a”、“aa” 等。
    • ?
      

      : 匹配前面的字符0次或1次。

      • 示例: a? 匹配空字符串或 “a”。
    • {m,n}
      

      : 匹配前面的字符至少

      m
      

      次,至多

      n
      

      次。

      • 示例: a{2,4} 匹配 “aa”、“aaa” 或 “aaaa”。
  7. 边界匹配:

    • ^
      

      : 匹配字符串的开头。

      • 示例: ^abc 匹配以 “abc” 开头的字符串。
    • $
      

      : 匹配字符串的结尾。

      • 示例: abc$ 匹配以 “abc” 结尾的字符串。
    • \b
      

      : 匹配单词边界。

      • 示例: \bword\b 匹配独立的单词 “word”。
  8. 特殊字符:

    • \d : 匹配任意数字,等价于 [0-9]
    • \D : 匹配任意非数字字符,等价于 [^0-9]
    • \w : 匹配任意字母数字字符,等价于 [a-zA-Z0-9_]
    • \W : 匹配任意非字母数字字符,等价于 [^a-zA-Z0-9_]
    • \s : 匹配任意空白字符,包括空格、制表符、换行符等。
    • \S : 匹配任意非空白字符。

常用函数

  1. re.match(pattern, string): 从字符串的开头尝试匹配模式。

    • 示例:

      python

      Copy code

      import re
      result = re.match(r'\d+', '123abc')
      if result:print(result.group())  # 输出: 123
      
  2. re.search(pattern, string): 搜索整个字符串,返回第一个匹配的结果。

    • 示例:

      python

      Copy code

      result = re.search(r'\d+', 'abc123def')
      if result:print(result.group())  # 输出: 123
      
  3. re.findall(pattern, string): 搜索整个字符串,返回所有匹配的结果列表。

    • 示例:

      python

      Copy code

      results = re.findall(r'\d+', 'abc123def456')
      print(results)  # 输出: ['123', '456']
      
  4. re.sub(pattern, repl, string): 替换字符串中所有匹配的子串。

    • 示例:

      python

      Copy code

      result = re.sub(r'\d+', '#', 'abc123def456')
      print(result)  # 输出: abc#def#
      
  5. re.split(pattern, string): 根据模式分割字符串,返回一个列表。

    • 示例:

      python

      Copy code

      import re
      result = re.split(r'\d+', 'abc123def456ghi')
      print(result)  # 输出: ['abc', 'def', 'ghi']
      
  6. re.compile(pattern): 编译正则表达式模式,返回一个正则表达式对象,后续可以使用该对象调用匹配方法。

    • 示例:

      python

      Copy code

      pattern = re.compile(r'\d+')
      result = pattern.match('123abc')
      if result:print(result.group())  # 输出: 123
      

捕获组和命名组

  1. 捕获组: 使用圆括号 () 将部分模式括起来,匹配的子串会被捕获到一个组中。

    • 示例:

      python

      Copy code

      match = re.search(r'(\d+)-(\d+)', '123-456')
      if match:print(match.group(1))  # 输出: 123print(match.group(2))  # 输出: 456
      
  2. 命名组: 使用 (?P<name>...) 语法给捕获组命名,便于后续引用。

    • 示例:

      python

      Copy code

      match = re.search(r'(?P<area_code>\d+)-(?P<number>\d+)', '123-456')
      if match:print(match.group('area_code'))  # 输出: 123print(match.group('number'))  # 输出: 456
      

非捕获组

有时你可能只想对一部分模式进行分组,但不希望捕获匹配结果。此时可以使用非捕获组 (?:...)

  • 示例:

    python

    Copy code

    match = re.search(r'(?:\d+)-(\d+)', '123-456')
    if match:print(match.group(1))  # 输出: 456
    

贪婪匹配和非贪婪匹配

  1. 贪婪匹配: 默认情况下,量词 (*, +, {m,n}) 是贪婪的,会尽可能多地匹配字符。

    • 示例:

      python

      Copy code

      match = re.search(r'<.*>', '<tag>content</tag>')
      if match:print(match.group())  # 输出: <tag>content</tag>
      
  2. 非贪婪匹配: 在量词后面加 ? 可以使其变为非贪婪匹配,尽可能少地匹配字符。

    • 示例:

      python

      Copy code

      match = re.search(r'<.*?>', '<tag>content</tag>')
      if match:print(match.group())  # 输出: <tag>
      

多行模式和点匹配所有模式

  1. 多行模式 (re.MULTILINE): 使 ^$ 匹配每一行的开头和结尾,而不仅仅是整个字符串的开头和结尾。

    • 示例:

      python

      Copy code

      text = """first line
      second line"""
      matches = re.findall(r'^\w+', text, re.MULTILINE)
      print(matches)  # 输出: ['first', 'second']
      
  2. 点匹配所有模式 (re.DOTALL): 使 . 匹配所有字符,包括换行符。

    • 示例:

      python

      Copy code

      text = "line one\nline two"
      match = re.search(r'line.*', text, re.DOTALL)
      if match:print(match.group())  # 输出: line one\nline two
      

示例总结

综合应用上述语法和函数,下面是一个更复杂的示例:

python

Copy code

import retext = """
John Doe, email: john.doe@example.com, phone: (123) 456-7890
Jane Smith, email: jane.smith@example.com, phone: (987) 654-3210
"""# 提取所有的 email 地址
emails = re.findall(r'\b[\w.-]+?@\w+?\.\w+?\b', text)
print("Emails:", emails)# 提取所有的电话号码
phones = re.findall(r'\(\d{3}\) \d{3}-\d{4}', text)
print("Phones:", phones)# 提取姓名

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

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

相关文章

MySQL之创建高性能的索引(八)

创建高性能的索引 覆盖索引 通常大家都会根据查询的WHERE条件来创建合适的索引&#xff0c;不过这只是索引优化的一个方面。设计优秀的索引应该考虑到整个查询&#xff0c;而不单单是WHERE条件部分。索引确实是一种查找数据的高效方式&#xff0c;但是MySQL也可以使用索引来直…

向量数据库引领 AI 创新——Zilliz 亮相 2024 亚马逊云科技中国峰会

2024年5月29日&#xff0c;亚马逊云科技中国峰会在上海召开&#xff0c;此次峰会聚集了来自全球各地的科技领袖、行业专家和创新企业&#xff0c;探讨云计算、大数据、人工智能等前沿技术的发展趋势和应用场景。作为领先的向量数据库技术公司&#xff0c;Zilliz 在本次峰会上展…

【漏洞复现】电信网关配置管理系统 rewrite.php 文件上传漏洞

0x01 产品简介 中国电信集团有限公司(英文名称"China Telecom”、简称“"中国电信”)成立于2000年9月&#xff0c;是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员…

在线IP检测如何做?代理IP需要检查什么?

当我们的数字足迹无处不在&#xff0c;隐私保护显得愈发重要。而代理IP就像是我们的隐身斗篷&#xff0c;让我们在各项网络业务中更加顺畅。 我们常常看到别人购买了代理IP服务后&#xff0c;通在线检测网站检查IP&#xff0c;相当于一个”售前检验““售后质检”的作用。但是…

2024-5-31 石群电路-19

2024-5-31&#xff0c;星期五&#xff0c;10:53&#xff0c;天气&#xff1a;阴雨&#xff0c;心情&#xff1a;晴。今天就要回学校啦&#xff0c;当大家看到这篇推文的时候我已经要收拾收拾去赶返校的火车啦&#xff0c;和女朋友短暂分别&#xff0c;不过小别胜新婚吗&#xf…

css动画效果(边框流光闪烁阴影效果)

1.整体效果 https://mmbiz.qpic.cn/sz_mmbiz_gif/EGZdlrTDJa7odDQYuaatklJUMc5anU10PWLAt14rNnNUD6oHJG9U63fc0yibiapuDViatVk62ma3K63oqQ3U1VtMQ/640?wx_fmtgif&fromappmsg&wxfrom13 CSS边框流光闪烁阴影动画效果是一种令人印象深刻的技术&#xff0c;它通过动态的光…

笔记-docker基于ubuntu22.04安装Jitsi Meet

背景 利用JitsiMeet打造一个可以在线会议的环境&#xff0c;根据躺的坑&#xff0c;做个记录 参考 JitsMeet部署安装说明 开始操作 环境 docker run -it --name ubuntu22.04 ubuntu:22.04 /bin/bash问题 1、安装 openjdk-11 apt install openjdk-11-jdk配置环境变量&…

es初始化

一.初始化es public void initES() {/*LOGGER.info("host" host);LOGGER.info("port" port);LOGGER.info("scheme" scheme);LOGGER.info("userName" userName);LOGGER.info("password" password);*/// 客户端连接创建…

自媒体必用的50 个最佳 ChatGPT 社交媒体帖子提示prompt通用模板教程

在这个信息爆炸的时代&#xff0c;社交媒体已经成为我们生活中不可或缺的一部分。无论是品牌宣传、个人展示&#xff0c;还是日常交流&#xff0c;我们都离不开它。然而&#xff0c;要在众多信息中脱颖而出&#xff0c;吸引大家的关注并不容易。这时候&#xff0c;ChatGPT这样的…

uniapp的tooltip功能放到表单laber

在uniapp中&#xff0c;tooltip功能通常是通过view组件的hover-class属性来实现的&#xff0c;而不是直接放在form的label上。hover-class属性可以定义当元素处于hover状态时的样式类&#xff0c;通过这个属性&#xff0c;可以实现一个类似tooltip的效果。 以下是一个简单的例…

代码随想录35期Day56-Java

Day56题目 LeetCode647回文子串的数量 核心思想:使用数组dp[i][j]表示s从i到j是否是回文串 class Solution {public int countSubstrings(String s) {// dp[i][j] 表示s从i到j是不是回文串boolean[][] dp new boolean[s.length()][s.length()];for(int i 0 ; i < s.len…

跨境经营的艺术:中资企业海外市场售后服务创新与挑战

出海&#xff0c;已不再是企业的“备胎”&#xff0c;而是必须面对的“大考”&#xff01;在这个全球化的大潮中&#xff0c;有的企业乘风破浪&#xff0c;勇攀高峰&#xff0c;也有的企业在异国他乡遭遇了“水土不服”。 面对“要么出海&#xff0c;要么出局”的抉择&#xff…

JavaScript笔记一-初识JavaScript

1、JavaScript的起源 JavaScript诞生于1995年&#xff0c;它的出现主要是用于处理网页中的前端验证。所谓的前端验证&#xff0c;就是指检查用户输入的内容是否符合一定的规则。比如&#xff1a;用户名的长度&#xff0c;密码的长度&#xff0c;邮箱的格式等。 2、JavaScript…

一分钟学习数据安全——自主管理身份SSI基本概念

之前我们已经介绍过数字身份的几种模式。其中&#xff0c;分布式数字身份模式逐渐普及演进的结果就是自主管理身份&#xff08;SSI&#xff0c;Self-Sovereign Identity&#xff09;。当一个人能够完全拥有和控制其数字身份&#xff0c;而无需依赖中心化机构&#xff0c;这就是…

FreeRTOS实时系统 在任务中增加数组等相关操作 导致单片机起不来或者挂掉

在调试串口任务中增加如下代码&#xff0c;发现可以用keil进行仿真&#xff0c;但是烧录程序后&#xff0c;调试串口没有打印&#xff0c;状态灯也不闪烁&#xff0c;单片机完全起不来 博主就纳了闷了&#xff0c;究竟是什么原因&#xff0c;这段代码可是公司永流传的老代码了&…

香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试(三)

整期笔记索引 香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试&#xff08;一&#xff09; 香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试&#xff08;二&#xff09; 香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试&#xff08;…

【MySQL数据库】:MySQL复合查询

目录 基本查询回顾 多表查询 自连接 子查询 单行子查询 多行子查询 多列子查询 在from子句中使用子查询 合并查询 前面我们讲解的mysql表的查询都是对一张表进行查询&#xff0c;在实际开发中这远远不够。 基本查询回顾 【MySQL数据库】&#xff1a;MySQL基本查…

【测试】linux快捷指令工具cxtool

简介 登录linux时,我们经常需要重复输入一些指令. 这个工具可以把这些指令预置,需要的时候鼠标一点,会自动按预置的字符敲击键盘,敲击出指令. 下载地址 https://download.csdn.net/download/bandaoyu/89379371 使用方法 1,编辑配置文件&#xff0c;自定义自己的快捷指令。 2…

WEB三大主流框架之Vue.js

Vue.js是一个用于构建用户界面的JavaScript框架[^1^]。它基于标准HTML、CSS和JavaScript构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助开发者高效地开发用户界面。Vue的核心功能包括&#xff1a; - 声明式渲染&#xff1a;Vue基于标准HTML扩展了一…

运算符重载(下)

目录 前置和后置重载前置的实现Date& Date::operator()代码 后置的实现Date Date::operator(int )代码 前置--和后置--重载前置--的实现Date& Date::operator--( )代码 后置--的实现Date Date::operator--(int )代码 流插入运算符重载流插入运算符重载的实现流提取运算…